
    Ri                       U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZ ddlmZ ddlmZ ddlmZ ddlZe
rdd	lmZmZ e
s ej                    d
k    rddlZddlmZ n G d d          Z e            Zded<    G d d          Z G d d          Z G d d          Z G d de          Z  G d d          Z!dS )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                      e Zd ZdZdZdZdZdS )winregN)__name__
__module____qualname__
HKEY_USERSHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_CLASSES_ROOT     O/Users/shanyulin/my-agent/.venv/lib/python3.11/site-packages/setuptools/msvc.pyr   r   #   s'        
 ! r   r   zdict[str, str]r   c                      e Zd ZdZ ej        dd                                          ZddZe	dd	            Z
ddZddZdddZdddZdddZdS )PlatformInfoz
    Current and Target Architectures information.

    Parameters
    ----------
    arch: str
        Target architecture.
    processor_architecture archstrreturnNonec                `    |                                                     dd          | _        d S )Nx64amd64)lowerreplacer   )selfr   s     r   __init__zPlatformInfo.__init__8   s%    JJLL((88			r   c                V    | j         | j                             d          dz   d         S )zs
        Return Target CPU architecture.

        Return
        ------
        str
            Target CPU
        _r   N)r   findr(   s    r   
target_cpuzPlatformInfo.target_cpu;   s*     y,,q02233r   boolc                    | j         dk    S )z
        Return True if target CPU is x86 32 bits..

        Return
        ------
        bool
            CPU is x86 32 bits
        x86r.   r-   s    r   target_is_x86zPlatformInfo.target_is_x86G   s     %''r   c                    | j         dk    S )z
        Return True if current CPU is x86 32 bits..

        Return
        ------
        bool
            CPU is x86 32 bits
        r1   current_cpur-   s    r   current_is_x86zPlatformInfo.current_is_x86R   s     5((r   Fc                R    | j         dk    r|rdn| j         dk    r|rdn	d| j          S )uk  
        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)
        r1   r   r%   \x64\r5   r(   hidex86r$   s      r   current_dirzPlatformInfo.current_dir]   sM    $  E))g) B  G+++ (d&((	
r   c                R    | j         dk    r|rdn| j         dk    r|rdn	d| j          S )ar  
        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)
        r1   r   r%   r9   r:   r2   r;   s      r   
target_dirzPlatformInfo.target_diru   sJ    $ 5((W( B 7**s* 'do''	
r   c                    |rdn| j         }| j        |k    rdn+|                                                     dd| d          S )ap  
        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.
        r1   r   r:   r+   )r6   r.   r?   r'   )r(   forcex86currents      r   	cross_dirzPlatformInfo.cross_dir   sU      $9%%)9 ')) B""**4gAA	
r   N)r   r    r!   r"   r!   r    )r!   r/   )FFF)r   r   r   __doc__r   getr&   r6   r)   propertyr.   r3   r7   r=   r?   rC   r   r   r   r   r   ,   s          '+6;;AACCK9 9 9 9 	4 	4 	4 X	4	( 	( 	( 	(	) 	) 	) 	)
 
 
 
 
0
 
 
 
 
0
 
 
 
 
 
 
r   r   c                  l   e Zd ZdZej        ej        ej        ej        fZ	ddZ
edd            Zedd	            Zedd
            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd d            Zedd!d            Zdd!dZd"dZdS )#RegistryInfoz
    Microsoft Visual Studio related registry information.

    Parameters
    ----------
    platform_info: PlatformInfo
        "PlatformInfo" instance.
    platform_infor   r!   r"   c                    || _         d S N)pi)r(   rK   s     r   r)   zRegistryInfo.__init__   s    r   r   c                    dS )z
        Microsoft Visual Studio root registry key.

        Return
        ------
        str
            Registry key
        VisualStudior   r-   s    r   visualstudiozRegistryInfo.visualstudio   s	     ~r   c                L    t           j                            | j        d          S )z
        Microsoft Visual Studio SxS registry key.

        Return
        ------
        str
            Registry key
        SxS)ospathjoinrQ   r-   s    r   sxszRegistryInfo.sxs   s     w||D-u555r   c                L    t           j                            | j        d          S )z|
        Microsoft Visual C++ VC7 registry key.

        Return
        ------
        str
            Registry key
        VC7rT   rU   rV   rW   r-   s    r   vczRegistryInfo.vc        w||DHe,,,r   c                L    t           j                            | j        d          S )z
        Microsoft Visual Studio VS7 registry key.

        Return
        ------
        str
            Registry key
        VS7rZ   r-   s    r   vszRegistryInfo.vs   r\   r   c                    dS )z
        Microsoft Visual C++ for Python registry key.

        Return
        ------
        str
            Registry key
        zDevDiv\VCForPythonr   r-   s    r   vc_for_pythonzRegistryInfo.vc_for_python   s
     %$r   c                    dS )zq
        Microsoft SDK registry key.

        Return
        ------
        str
            Registry key
        zMicrosoft SDKsr   r-   s    r   microsoft_sdkzRegistryInfo.microsoft_sdk   s
      r   c                L    t           j                            | j        d          S )z
        Microsoft Windows/Platform SDK registry key.

        Return
        ------
        str
            Registry key
        r   rT   rU   rV   rc   r-   s    r   windows_sdkzRegistryInfo.windows_sdk  s     w||D.	:::r   c                L    t           j                            | j        d          S )z
        Microsoft .NET Framework SDK registry key.

        Return
        ------
        str
            Registry key
        NETFXSDKre   r-   s    r   	netfx_sdkzRegistryInfo.netfx_sdk  s     w||D.
;;;r   c                    dS )z
        Microsoft Windows Kits Roots registry key.

        Return
        ------
        str
            Registry key
        zWindows Kits\Installed Rootsr   r-   s    r   windows_kits_rootszRegistryInfo.windows_kits_roots  s
     /.r   Fkeyr1   r/   c                    d S rM   r   r(   rl   r1   s      r   	microsoftzRegistryInfo.microsoft%  s    QTQTr   r    c                    d S rM   r   rn   s      r   ro   zRegistryInfo.microsoft'  s    =@Sr   c                    | j                                         s|rdnd}t          j                            d|d|          S )a  
        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)rN   r7   rT   rU   rV   )r(   rl   r1   node64s       r   ro   zRegistryInfo.microsoft)  s?      w--//I3IMw||JSAAAr   name
str | Nonec           	        t           j        }t           j        }t           j        }| j        }| j        D ]}d}	  || ||          d|          }nV# t          $ rI | j                                        s+	  || ||d          d|          }n# t          $ r Y Y gw xY wY mY nw xY w	 t          j	        ||          d         |r ||           c S c S # t          $ r Y nw xY w	 |r ||           # |r ||           w w xY wdS )a%  
        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CloseKeyro   HKEYSOSErrorrN   r7   QueryValueEx)	r(   rl   rv   key_readopenkeyclosekeymshkeybkeys	            r   lookupzRegistryInfo.lookup<  s     ?.?^J 	# 	#DD	wtRRWWa::   w--// !&wtRRT]]AxHH" ! ! ! ! H	 #*466q9  #HTNNNNNN# # #     #HTNNN  #HTNNNN#tsY   A#B#4BB#
BB#BB#"B#'C
C!C3 C!!C33DN)rK   r   r!   r"   )r!   r   rE   )rl   r   r1   r/   r!   r   )rl   r    r1   r/   r!   r    )rl   r    rv   r    r!   rw   )r   r   r   rF   r   r   r   r   r   r|   r)   rH   rQ   rW   r[   r_   ra   rc   rf   ri   rk   r   ro   r   r   r   r   rJ   rJ      s         	 ! 	E        	 	 	 X	 	6 	6 	6 X	6 	- 	- 	- X	- 	- 	- 	- X	- 	% 	% 	% X	% 	  	  	  X	  	; 	; 	; X	; 	< 	< 	< X	< 	/ 	/ 	/ X	/ TTTT XT@@@@ X@B B B B B&' ' ' ' ' 'r   rJ   c                  F   e Zd ZdZ ej        dd          Z ej        dd          Z ej        de          Z	 d.d/dZ	d Z
d0dZd1dZed             Zed2d            Zed2d            Zd Zd Zed3d            Zed2d            Zed2d            Zed4d            Zed2d            Zed4d             Zed2d!            Zed3d"            Zed4d#            Zed2d$            Zed2d%            Zed5d'            Zed5d(            Z d5d)Z!ed6d7d-            Z"dS )8
SystemInfoz
    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)Nregistry_inforJ   vc_verfloat | Noner!   r"   c                    || _         | j         j        | _        |                                 | _        |p|                                 x| _        | _        d S rM   )rirN   find_programdata_vs_versknown_vs_paths_find_latest_available_vs_vervs_verr   )r(   r   r   s      r   r)   zSystemInfo.__init__x  sO      '*";;== %+$Rd.P.P.R.RRdkkkr   c                    |                                  }|s&| j        st          j                            d          t          |          }|                    | j                   t          |          S )zm
        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   z(SystemInfo._find_latest_available_vs_ver  su     ++-- 	t2 	"997   k""t*+++7||r   list[float]c           
        | j         j        }| j         j        | j         j        | j         j        f}g }t          j        | j         j        |          D ]w\  }}	 t          j	        | ||          dt          j
                  }n# t          $ r Y >w xY w|5  t          j        |          \  }}}	t          |          D ]t}
t          j        t                     5  t#          t          j        ||
          d                   }||vr|                    |           ddd           n# 1 swxY w Y   ut          |          D ]n}
t          j        t                     5  t#          t          j        ||
                    }||vr|                    |           ddd           n# 1 swxY w Y   o	 ddd           n# 1 swxY w Y   yt+          |          S )z
        Find Microsoft Visual Studio versions available in registry.

        Return
        ------
        list of float
            Versions
        r   N)r   ro   r[   ra   r_   	itertoolsproductr|   r   rz   ry   r}   QueryInfoKeyrange
contextlibsuppress
ValueErrorfloat	EnumValueappendEnumKeysorted)r(   r   vckeysvs_versr   rl   r   subkeysvaluesr+   ivers               r   r   zSystemInfo.find_reg_vs_vers  s    W'*dg3TWZ@"*47=&AA 	0 	0ID#~dBBsGGQHH    0 0%+%8%>%>"v 0 0A#,Z88 0 0#F$4T1$=$=a$@AAg--#NN3///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 w 0 0A#,Z88 0 0#FN4$;$;<<g--#NN3///0 0 0 0 0 0 0 0 0 0 0 0 0 0 000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 gsn   *B
BBAF=AD&	F=&D**F=-D*..F=<F$	F=$F((F=+F(,F==G	G	dict[float, str]c                   i }d}	 t          j        |          }n# t          $ r |cY S w xY w|D ]}	 t           j                            ||d          }t          |dd          5 }t          j        |          }ddd           n# 1 swxY w Y   |d         }t          j        t           j                            |d                     |||                     |d	                   <   # t          t          f$ r Y w xY w|S )
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)
rT   listdirr}   rU   rV   openjsonload_as_float_versionKeyError)	r(   vs_versionsinstances_dirhashed_namesrv   
state_path
state_filestatevs_paths	            r   r   z#SystemInfo.find_programdata_vs_vers  sq    )+T	:m44LL 	 	 		 ! 	 	DW\\-|LL
*dW=== 2 Ij11E2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 23 
27<<1ABBCCC  D2259N3OPPQQ X&    sB    **3C*%B:C*B
	
C*B
	AC**C>=C>c                |    t          d                    |                     d          dd                             S )z
        Return a string version as a simplified float version (major.minor)

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

        Return
        ------
        float
            version
        .N   )r   rV   split)versions    r   r   zSystemInfo._as_float_version  s3     SXXgmmC00!455666r   r    c                    t           j                            | j        d| j        d          }| j                            | j        j        | j        d          p|S )zp
        Microsoft Visual Studio directory.

        Return
        ------
        str
            path
        Microsoft Visual Studio 0.1f)rT   rU   rV   ProgramFilesx86r   r   r   r_   )r(   defaults     r   VSInstallDirzSystemInfo.VSInstallDir  sX     ',, "OT["O"O"O
 

 w~~dgjT[*?*?@@KGKr   c                    |                                  p|                                 }t          j                            |          s!d}t
          j                            |          |S )zm
        Microsoft Visual C++ directory.

        Return
        ------
        str
            path
        z(Microsoft Visual C++ directory not found)	_guess_vc_guess_vc_legacyrT   rU   isdirr   r   r   )r(   rU   msgs      r   VCInstallDirzSystemInfo.VCInstallDir  s[     ~~:4#8#8#:#:w}}T"" 	?<C"99#>>>r   c                   | j         dk    rdS 	 | j        | j                  }n# t          $ r
 | j        }Y nw xY wt          j                            |d          }	 t	          j        |          d         }|                     |          | _	        t          j                            ||          S # t          t          f$ r Y dS w xY w)zl
        Locate Visual C++ for VS2017+.

        Return
        ------
        str
            path
              ,@r   r   )r   r   r   r   rT   rU   rV   r   r   r   r}   
IndexError)r(   vs_dirguess_vcr   s       r   r   zSystemInfo._guess_vc  s     ;$2	'(5FF 	' 	' 	'&FFF	' 7<<(899	Z))"-F0088DK7<<&111$ 	 	 	22	s   " 66AB. .CCc                   t           j                            | j        d| j        dd          }t           j                            | j        j        | j        d          }| j                            |d          }|r t           j                            |d          n|}| j                            | j        j        | j        d          p|S )z{
        Locate Visual C++ for versions prior to 2017.

        Return
        ------
        str
            path
        r   r   z\VC
installdirVC)	rT   rU   rV   r   r   r   ra   r   r[   )r(   r   reg_path	python_vc
default_vcs        r   r   zSystemInfo._guess_vc_legacy3  s     ',, =====
 
 7<< 5$+7L7LMMGNN8\::	6?LRW\\)T222W
 w~~dgjT[*?*?@@NJNr   tuple[LiteralString, ...]c                    | j         dk    rdS | j         dk    rdS | j         dk    rdS | j         dk    rdS | j         d	k    rd
S dS )z
        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   WindowsSdkVersionzSystemInfo.WindowsSdkVersionI  sd     ;#''[D   =[D   =[D   =[D   =rr   c                r    |                      t          j                            | j        d                    S )zt
        Microsoft Windows SDK last version.

        Return
        ------
        str
            version
        lib)_use_last_dir_namerT   rU   rV   WindowsSdkDirr-   s    r   WindowsSdkLastVersionz SystemInfo.WindowsSdkLastVersion_  s+     &&rw||D4F'N'NOOOr   c                4   d}| j         D ]N}t          j                            | j        j        d|           }| j                            |d          }|r nO|rt          j                            |          snt          j                            | j        j        | j	        d          }| j                            |d          }|r t          j                            |d          }|rt          j                            |          sr| j         D ]j}|d|
                    d                   }d	| }t          j                            | j        |          }t          j                            |          r|}k|rt          j                            |          sU| j         D ]M}d
| }t          j                            | j        |          }t          j                            |          r|}N|s%t          j                            | j        d          }|S )zn
        Microsoft Windows SDK directory.

        Return
        ------
        str
            path
        r   vinstallationfolderr   r   WinSDKNr   zMicrosoft SDKs\Windows Kits\zMicrosoft SDKs\Windows\vPlatformSDK)r   rT   rU   rV   r   rf   r   r   ra   r   rfindr   r   )r(   sdkdirr   locrU   install_baseintverds           r   r   zSystemInfo.WindowsSdkDirk  s     ) 	 	C',,tw2III>>CW^^C)=>>F  	>RW]]622 	>7<< 5$+7L7LMMD7>>$==L >lH== 	RW]]622 	-  -syy~~-.?v??GLL!2D997==## F 	RW]]622 	-  8388GLL!2D997==## F 	DW\\$"3]CCFr   rw   c                
   | j         dk    rd}d}nAd}| j         dk    rdnd}| j                            d|                              d	d
          }d| d| }g }| j         dk    r9| j        D ]1}|t
          j                            | j        j	        ||          gz  }2| j
        D ]5}|t
          j                            | j        j        d| d|          gz  }6|D ]#}| j                            |d          }|r|c S $dS )z
        Microsoft Windows SDK executable directory.

        Return
        ------
        str | None
            path
        r   #   r   (   r   TF)r$   r<   r:   -zWinSDK-NetFxToolsr   r   Ar   N)r   rN   r=   r'   NetFxSdkVersionrT   rU   rV   r   ri   r   rf   r   )	r(   netfxverr   r<   fxregpathsr   rU   execpaths	            r   WindowsSDKExecutablePathz#SystemInfo.WindowsSDKExecutablePath  sK    ;$HDDH"kT11dduG7&&4&AAII$PSTTD1H11411 ;$+ G GRW\\$'*;S"EEFF) 	L 	LCdg&9:s:::rJJKKHH  	  	 Dw~~d,@AAH    tr   c                    t           j                            | j        j        | j        dd          }| j                            |d          pdS )zl
        Microsoft Visual F# directory.

        Return
        ------
        str
            path
        r   z	\Setup\F#
productdirr   )rT   rU   rV   r   rQ   r   r   )r(   rU   s     r   FSharpInstallDirzSystemInfo.FSharpInstallDir  sG     w||DG0dk2Q2Q2Q2QRRw~~dL117R7r   c                    | j         dk    rdnd}|D ]0}| j                            | j        j        d|           }|r|c S 1dS )z{
        Microsoft Universal CRT SDK directory.

        Return
        ------
        str | None
            path
        r   )1081r   kitsrootN)r   r   r   rk   )r(   versr   r   s       r   UniversalCRTSdkDirzSystemInfo.UniversalCRTSdkDir  sj      ${d22||  	 	CW^^DG$>@P3@P@PQQF  tr   c                    	 |                      t          j                            | j        d                    S # t
          $ r}t          j        |d            d}~ww xY w)z
        Microsoft Universal C Runtime SDK last version.

        Return
        ------
        str
            version
        r   Cannot find UniversalCRTSdkDirN)r   rT   rU   rV   r  	TypeErrorr
   add_note)r(   exs     r   UniversalCRTSdkLastVersionz%SystemInfo.UniversalCRTSdkLastVersion  sd    	**27<<8OQV+W+WXXX 	 	 	N2?@@@	s   7: 
AAAc                     | j         dk    rdndS )z
        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  zSystemInfo.NetFxSdkVersion  s"     {d"" XW	
r   c                    d}| j         D ]K}t          j                            | j        j        |          }| j                            |d          }|r nL|S )z|
        Microsoft .NET Framework SDK directory.

        Return
        ------
        str | None
            path
        r   kitsinstallationfolder)r  rT   rU   rV   r   ri   r   )r(   r   r   r   s       r   NetFxSdkDirzSystemInfo.NetFxSdkDir  sb      ' 	 	C',,tw0#66CW^^C)ABBF r   c                    t           j                            | j        d          }| j                            | j        j        d          p|S )zw
        Microsoft .NET Framework 32bit directory.

        Return
        ------
        str
            path
        zMicrosoft.NET\Frameworkframeworkdir32rT   rU   rV   r   r   r   r[   r(   guess_fws     r   FrameworkDir32zSystemInfo.FrameworkDir32  s>     7<<-GHH w~~dgj*:;;GxGr   c                    t           j                            | j        d          }| j                            | j        j        d          p|S )zw
        Microsoft .NET Framework 64bit directory.

        Return
        ------
        str
            path
        zMicrosoft.NET\Framework64frameworkdir64r  r  s     r   FrameworkDir64zSystemInfo.FrameworkDir64   s>     7<<-IJJ w~~dgj*:;;GxGr   tuple[str, ...]c                ,    |                      d          S )z
        Microsoft .NET Framework 32bit versions.

        Return
        ------
        tuple of str
            versions
            _find_dot_net_versionsr-   s    r   FrameworkVersion32zSystemInfo.FrameworkVersion320       **2...r   c                ,    |                      d          S )z
        Microsoft .NET Framework 64bit versions.

        Return
        ------
        tuple of str
            versions
        @   r&  r-   s    r   FrameworkVersion64zSystemInfo.FrameworkVersion64<  r)  r   c                d   | j                             | j         j        d|           }t          | d|           }|p|                     |d          pd}| j        dk    r|dfS | j        dk    r&|                                dd	         d
k    rdn|dfS | j        dk    rdS | j        dk    rdS dS )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   )r1  
v2.0.50727g       @)zv3.0r2  r   )r   r   r[   getattrr   r   r&   )r(   bitsreg_verdot_net_dirr   s        r   r'  z!SystemInfo._find_dot_net_versionsH  s     '..-BD-B-BCCd$94$9$9::H00cBBHb ;$;[D  #&99;;rr?d#:#:<<VKK[C''[C''rr   rU   r	   prefixc                      fdt          t          j                             D             }t          |d          S )a-  
        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     K   | ]X}t           j                            t           j                            |                    ?|                              T|V  Yd S rM   )rT   rU   r   rV   
startswith).0dir_namerU   r7  s     r   	<genexpr>z0SystemInfo._use_last_dir_name.<locals>.<genexpr>w  ss       
 
w}}RW\\$99::
 ##F++	

 
 
 
 
 
r   r   )reversedrT   r   next)rU   r7  matching_dirss   `` r   r   zSystemInfo._use_last_dir_namef  sU    "
 
 
 
 
$RZ%5%566
 
 
 M2&&&r   rM   )r   rJ   r   r   r!   r"   )r!   r   )r!   r   rD   )r!   r   r!   rw   )r!   r#  )r   )rU   r	   r7  r    r!   r    )#r   r   r   rF   r   rG   r   r   r   r)   r   r   r   staticmethodr   rH   r   r   r   r   r   r   r   r  r	  r  r  r  r  r  r"  r(  r,  r'  r   r   r   r   r   r   f  s       	 	 W[2&&F7;~r22L!gk"5|DDO CG	S 	S 	S 	S 	S  (   >( ( ( (T 7 7 \7  L L L XL"    X"  <O O O,    X* 	P 	P 	P X	P ( ( ( X(T " " " X"H 
8 
8 
8 X
8    X(    X 
 
 
 X
     X" H H H XH H H H XH 	/ 	/ 	/ X	/ 	/ 	/ 	/ X	/   < ' ' ' ' \' ' 'r   r   c                  B    e Zd ZU ded<   ded<   ded<   ded<   ded<   dS )	_EnvironmentDictr    includer   libpathrU   zNotRequired[str | None]py_vcruntime_redistN)r   r   r   __annotations__r   r   r   rD  rD    sB         LLLHHHLLLIII000000r   rD  c                  L   e Zd ZdZd)d*dZed             Zed             Zed	             Zed
             Z	ed             Z
ed             Zed             Zed             Zed             Zed             Zed             Zd Zed+d            Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed,d            Zed,d            Zed+d            Zed              Zed-d"            Zd.d/d'Zd( Z dS )0EnvironmentInfoaY  
    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.
    Nr   r!   r"   c                    t          |          | _        t          | j                  | _        t	          | j        |          | _        | j        |k     r!d}t          j        	                    |          d S )Nz.No suitable Microsoft Visual C++ version found)
r   rN   rJ   r   r   sir   r   r   r   )r(   r   r   
vc_min_vererrs        r   r)   zEnvironmentInfo.__init__  sf    t$$tw''TWf--;##BC"99#>>> $#r   c                    | j         j        S )zk
        Microsoft Visual Studio.

        Return
        ------
        float
            version
        )rL  r   r-   s    r   r   zEnvironmentInfo.vs_ver       w~r   c                    | j         j        S )zp
        Microsoft Visual C++ version.

        Return
        ------
        float
            version
        )rL  r   r-   s    r   r   zEnvironmentInfo.vc_ver  rP  r   c                     ddg} j         dk    r1 j                            dd          }|dgz  }|dgz  }|d| gz  } fd|D             S )	zu
        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 Toolsc                d    g | ],}t           j                            j        j        |          -S r   rT   rU   rV   rL  r   r;  rU   r(   s     r   
<listcomp>z+EnvironmentInfo.VSTools.<locals>.<listcomp>  .    KKKTTW1488KKKr   )r   rN   r=   )r(   pathsarch_subdirs   `  r   VSToolszEnvironmentInfo.VSTools  s      !12;$'--d-EEKJKKE566ECkCCDDEKKKKUKKKKr   c                    t           j                            | j        j        d          t           j                            | j        j        d          gS )z
        Microsoft Visual C++ & Microsoft Foundation Class Includes.

        Return
        ------
        list of str
            paths
        IncludezATLMFC\IncluderT   rU   rV   rL  r   r-   s    r   
VCIncludeszEnvironmentInfo.VCIncludes  s?     GLL-y99GLL-/@AA
 	
r   c                      j         dk    r j                            d          }n j                            d          }d| d| g} j         dk    r	|d| gz  } fd	|D             S )
z
        Microsoft Visual C++ & Microsoft Foundation Class Libraries.

        Return
        ------
        list of str
            paths
              .@Tr$   r<   Libz
ATLMFC\Libr   z	Lib\storec                d    g | ],}t           j                            j        j        |          -S r   r^  rV  s     r   rW  z/EnvironmentInfo.VCLibraries.<locals>.<listcomp>  rX  r   )r   rN   r?   )r(   rZ  rY  s   `  r   VCLibrarieszEnvironmentInfo.VCLibraries  s     ;$',,,66KK',,T,::K${$$&AK&A&AB;$0;0011EKKKKUKKKKr   c                r    | j         dk     rg S t          j                            | j        j        d          gS )z
        Microsoft Visual C++ store references Libraries.

        Return
        ------
        list of str
            paths
        r   zLib\store\references)r   rT   rU   rV   rL  r   r-   s    r   VCStoreRefszEnvironmentInfo.VCStoreRefs  s5     ;ITW13JKKLLr   c                   | j         }t          j                            |j        d          g}| j        dk    rdnd}| j                            |          }|r,|t          j                            |j        d|           gz  }| j        dk    rId| j                            d           }|t          j                            |j        |          gz  }n/| j        dk    r| j        j	        
                    d	d
                                          }t          j                            dd| d          }|t          j                            |j        || j                            d          z            gz  }| j        j	        | j        j        k    rE|t          j                            |j        || j                            d          z            gz  }n)|t          j                            |j        d          gz  }|S )a  
        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   rc  ra  r%   r$   binHostz%srb  )rL  rT   rU   rV   r   r   rN   rC   r=   r6   r'   upperr?   r.   )r(   rL  toolsrA   rZ  rU   host_idhost_dirs           r   VCToolszEnvironmentInfo.VCTools  s   ( Wbo|<<=;$..44Eg''11 	Jbgll2?4G+4G4GHHIIE;$<,,T,::<<Dbgll2?D99::EE[D  g)11'5AAGGIIGw||E+='+=+=+=>>HR_h9K9KPT9K9U9U.UVV E w"dg&888GLLDG4G4GD4G4Q4Q)Q   bgll2?E::;;Er   c                   | j         dk    rJ| j                            dd          }t          j                            | j        j        d|           gS | j                            d          }t          j                            | j        j        d          }| j        }t          j                            || d|           gS )zw
        Microsoft Windows SDK Libraries.

        Return
        ------
        list of str
            paths
        r   TrS  rd  rb  r   um)	r   rN   r?   rT   rU   rV   rL  r   _sdk_subdir)r(   rZ  r   libvers       r   OSLibrarieszEnvironmentInfo.OSLibraries:  s     ;$',,Tt,DDKGLL!68Kk8K8KLLMM ',,,66K',,tw4e<<C%FGLL&@&@;&@&@AABBr   c                   t           j                            | j        j        d          }| j        dk    r"|t           j                            |d          gS | j        dk    r| j        }nd}t           j                            || d          t           j                            || d          t           j                            || d          gS )	zu
        Microsoft Windows SDK Include.

        Return
        ------
        list of str
            paths
        rE  r   glr   r   sharedrt  winrt)rT   rU   rV   rL  r   r   ru  )r(   rE  sdkvers      r   
OSIncludeszEnvironmentInfo.OSIncludesN  s     ',,tw4i@@;$RW\\'48899 {d"")W&7&7&788Wmmm44W&6&6&677 r   c                   t           j                            | j        j        d          }g }| j        dk    r
|| j        z  }| j        dk    r$|t           j                            |d          gz  }| j        dk    r||t           j                            | j        j        d          t           j                            |dd          t           j                            |d	d          t           j                            |d
d          t           j                            | j        j        dd| j        dddd          gz  }|S )z}
        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)rT   rU   rV   rL  r   r   rw  )r(   refrF  s      r   	OSLibpathzEnvironmentInfo.OSLibpathh  s$    gll470,??;#t''G;$S*HIIJJG;$TW2ODDS"KYWWS"I9UUG  G)#&{)) )  G$ r   c                D    t          |                                           S )zs
        Microsoft Windows SDK Tools.

        Return
        ------
        list of str
            paths
        )list
_sdk_toolsr-   s    r   SdkToolszEnvironmentInfo.SdkTools  s     DOO%%&&&r   c              #    K   | j         dk     r;| j         dk    rdnd}t          j                            | j        j        |          V  | j                                        sL| j                            d          }d| }t          j                            | j        j        |          V  | j         dv rj| j        	                                rd}n| j                            dd	          }d
| }t          j                            | j        j        |          V  n| j         dk    rwt          j                            | j        j        d          }| j                            d          }| j        j
        }t          j                            || |           V  | j        j        r| j        j        V  dS dS )z
        Microsoft Windows SDK Tools paths generator.

        Return
        ------
        generator of str
            paths
        ra  r   rk  zBin\x86Trb  )r   r   r   rS  zBin\NETFX 4.0 ToolsN)r   rT   rU   rV   rL  r   rN   r7   r=   r3   r   r  )r(   bin_dirrZ  rU   r|  s        r   r  zEnvironmentInfo._sdk_tools  s      ;#{d22ee
G',,tw4g>>>>>w%%'' 	<'--$-77K&&&D',,tw4d;;;;;;,&&w$$&& J "g11$D1II7+77D',,tw4d;;;;;;[D  7<< 5u==D'--$-77KW2F',,t%=%=%=>>>>>7+ 	3'222222	3 	3r   r    c                ,    | j         j        }|r| dndS )zu
        Microsoft Windows SDK version subdir.

        Return
        ------
        str
            subdir
        r:   r   )rL  r   r(   ucrtvers     r   ru  zEnvironmentInfo._sdk_subdir  s#     '/#*272r   c                r    | j         dk    rg S t          j                            | j        j        d          gS )zs
        Microsoft Windows SDK Setup.

        Return
        ------
        list of str
            paths
        r   Setup)r   rT   rU   rV   rL  r   r-   s    r   SdkSetupzEnvironmentInfo.SdkSetup  s4     ;ITW2G<<==r   c                t   | j         }| j        | j        dk    r-d}|                                 o|                                 }n>|                                p|                                }|j        dk    p
|j        dk    }g }|r|fdj        D             z  }|r|fdj        D             z  }|S )zv
        Microsoft .NET Framework Tools.

        Return
        ------
        list of str
            paths
        r   Tr%   c                Z    g | ]'}t           j                            j        |          (S r   )rT   rU   rV   r  r;  r   rL  s     r   rW  z+EnvironmentInfo.FxTools.<locals>.<listcomp>  9       9<R.44  r   c                Z    g | ]'}t           j                            j        |          (S r   )rT   rU   rV   r"  r  s     r   rW  z+EnvironmentInfo.FxTools.<locals>.<listcomp>  r  r   )	rN   rL  r   r3   r7   r6   r.   r(  r,  )r(   rN   	include32	include64ro  rL  s        @r   FxToolszEnvironmentInfo.FxTools  s    WW;$I,,...Jr7H7H7J7J3JII((**Ab.?.?.A.AI'1MR]g5MI 	    @B@U   E  	    @B@U   E r   c                    | j         dk     s| j        j        sg S | j                            d          }t
          j                            | j        j        d|           gS )z~
        Microsoft .Net Framework SDK Libraries.

        Return
        ------
        list of str
            paths
        r   Trb  zlib\um)r   rL  r  rN   r?   rT   rU   rV   )r(   rZ  s     r   NetFxSDKLibrariesz!EnvironmentInfo.NetFxSDKLibraries  s_     ;TW%8Ig((T(22TW02IK2I2IJJKKr   c                    | j         dk     s| j        j        sg S t          j                            | j        j        d          gS )z}
        Microsoft .Net Framework SDK Includes.

        Return
        ------
        list of str
            paths
        r   z
include\um)r   rL  r  rT   rU   rV   r-   s    r   NetFxSDKIncludesz EnvironmentInfo.NetFxSDKIncludes
  s>     ;TW%8ITW0-@@AAr   c                X    t           j                            | j        j        d          gS )z
        Microsoft Visual Studio Team System Database.

        Return
        ------
        list of str
            paths
        zVSTSDB\DeployrU  r-   s    r   VsTDbzEnvironmentInfo.VsTDb  s#     TW13CDDEEr   c                `   | j         dk     rg S | j         dk     r(| j        j        }| j                            d          }n| j        j        }d}d| j         dd| }t          j                            ||          g}| j         dk    r%|t          j                            ||d	          gz  }|S )
zn
        Microsoft Build Engine.

        Return
        ------
        list of str
            paths
        r   ra  Trc  r   zMSBuild\r   z\binRoslyn)	r   rL  r   rN   r=   r   rT   rU   rV   )r(   	base_pathrZ  rU   builds        r   MSBuildzEnvironmentInfo.MSBuild%  s     ;I[4/I'--d-;;KK,IK>4;>>>>>i../;$bgll9dH==>>Er   c                r    | j         dk     rg S t          j                            | j        j        d          gS )zt
        Microsoft HTML Help Workshop.

        Return
        ------
        list of str
            paths
        r   zHTML Help Workshop)r   rT   rU   rV   rL  r   r-   s    r   HTMLHelpWorkshopz EnvironmentInfo.HTMLHelpWorkshopA  s5     ;ITW46JKKLLr   	list[str]c                T   | j         dk     rg S | j                            d          }	 t          j                            | j        j        d          }n(# t          $ r}t          j
        |d            d}~ww xY w| j        }t          j                            || d|           gS )z
        Microsoft Universal C Runtime SDK Libraries.

        Return
        ------
        list of str
            paths
        r   Trb  r   r  Nucrt)r   rN   r?   rT   rU   rV   rL  r  r  r
   r  _ucrt_subdir)r(   rZ  r   r  r  s        r   UCRTLibrarieszEnvironmentInfo.UCRTLibrariesP  s     ;Ig((T(22	',,tw95AACC 	 	 	N2?@@@	 #SW"?"?+"?"?@@AAs   *A 
A:A55A:c                   | j         dk     rg S 	 t          j                            | j        j        d          }n(# t          $ r}t          j        |d            d}~ww xY wt          j                            || j	         d          gS )z
        Microsoft Universal C Runtime SDK Include.

        Return
        ------
        list of str
            paths
        r   rE  r  Nr  )
r   rT   rU   rV   rL  r  r  r
   r  r  )r(   rE  r  s      r   UCRTIncludeszEnvironmentInfo.UCRTIncludesf  s     ;I	gll47#=yIIGG 	 	 	N2?@@@	 W):&@&@&@AABBs   *: 
AAAc                ,    | j         j        }|r| dndS )z
        Microsoft Universal C Runtime SDK version subdir.

        Return
        ------
        str
            subdir
        r:   r   )rL  r  r  s     r   r  zEnvironmentInfo._ucrt_subdirz  s#     '4#*272r   c                J    d| j         cxk    rdk    rn ng S | j        j        gS )zk
        Microsoft Visual F#.

        Return
        ------
        list of str
            paths
        r   r   )r   rL  r	  r-   s    r   FSharpzEnvironmentInfo.FSharp  s;     $+$$$$$$$$$I())r   rw   c                *   d| j          d| j                            d                              d          g }| j        j        }t          j                            |	                    dd                    }t          j        
                    |          r]t          j                            |t          j        |          d                   }||t          j                            |d	          gz  }|t          j                            |d
          gz  }d| j         dz   ddt          | j                  dz   df}fdt          j        ||          D             }t#          t%          t          j        j        |          d          S )z{
        Microsoft Visual C++ runtime redistributable dll.

        Returns the first suitable path found or None.
        	vcruntimez0.dllTrb  r:   z\Toolsz\Redistr   onecoreredistzMicrosoft.VC
   z.CRTc              3  b   K   | ])\  }}t           j                            ||          V  *d S rM   )rT   rU   rV   )r;  r7  crt_dirrZ  r  s      r   r=  z2EnvironmentInfo.VCRuntimeRedist.<locals>.<genexpr>  sO       
 
! GLLgyAA
 
 
 
 
 
r   N)r   rN   r?   striprL  r   rT   rU   dirnamer'   r   rV   r   intr   r   r   r?  filterisfile)r(   prefixes
tools_pathredist_pathcrt_dirscandidate_pathsrZ  r  s         @@r   VCRuntimeRedistzEnvironmentInfo.VCRuntimeRedist  s~    3222	g((T(2288>> W)
gooj&8&8J&O&OPP7==%% 	L',,{BJ{4K4KB4OPPKbgll;	&J&JKKHRW\\*h7788 24;+11163t{++b0666

 
 
 
 
%.%6x%J%J
 
 
 F27>?;;TBBBr   Texistsr/   rD  c                   t          |                     d| j        | j        | j        | j        g|          |                     d| j        | j        | j        | j	        | j
        g|          |                     d| j        | j        | j        | j        g|          |                     d| j        | j        | j        | j        | j        | j        | j        | j        | j        g	|                    }| j        dk    r| j        r
| j        |d<   |S )z
        Return environment dict.

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

        Return
        ------
        dict
            environment
        rE  r   rF  rU   )rE  r   rF  rU      rG  )rD  _build_pathsr_  r}  r  r  rf  rw  r  r  r  rh  r  rr  r[  r  r  r  r  r  r  r   r  )r(   r  envs      r   
return_envzEnvironmentInfo.return_env  s9    %%OO%)	 	 	 !!$$L&* 
 
 %%!4<1A4>R 
 ""LLJMMLL)K
  7*
 *
 *
V ;"!5)-)=C%&
r   c                   t           j                            |          }t          j        |d                              t          j                  }t          j        ||          }|r,t          t          t          j
        j        |                    n|}|s6|                                 d}t          j                            |          t!          |          }	t          j                            |	          S )aC  
        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   rG   r   rT   pathsepr  r  rU   r   rn  r   r   r   r   rV   )
r(   rv   spec_path_listsr  
spec_paths	env_pathsrY  extant_pathsr   unique_pathss
             r   r  zEnvironmentInfo._build_paths  s    . _22?CC
Kb))//
;;	
I66=CNtF27=%88999 	?ZZ\\AAAC"99#>>>&|44z|,,,r   )Nr   )r!   r"   rD   )r!   r  rA  )T)r  r/   r!   rD  )!r   r   r   rF   r)   rH   r   r   r[  r_  rf  rh  rr  rw  r}  r  r  r  ru  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   rJ  rJ    s8        .? ? ? ? ? 	 	 X	 	 	 X	 L L XL& 
 
 X
 L L XL( M M XM 0 0 X0d C C XC&   X2 % % X%N 	' 	' X	'!3 !3 !3F 
3 
3 
3 X
3 > > X>   X< L L XL B B XB 	F 	F X	F   X6 M M XM B B B XB* C C C XC& 
3 
3 
3 X
3 * * X*  C  C  C X CD; ; ; ; ;z- - - - -r   rJ  )"rF   
__future__r   r   r   r   rT   os.pathplatformtypingr   r   r   more_itertoolsr   _pathr	   compatr
   distutils.errorsr   typing_extensionsr   r   systemr   r   dictrH  r   rJ   r   rD  rJ  r   r   r   <module>r     sZ     # " " " " "          				   5 5 5 5 5 5 5 5 5 5 * * * * * *                 =<<<<<<<<  %**i77MMM! ! ! ! ! ! ! ! #dffG$$$$v
 v
 v
 v
 v
 v
 v
 v
r~ ~ ~ ~ ~ ~ ~ ~BW' W' W' W' W' W' W' W't1 1 1 1 1y 1 1 1M
- M
- M
- M
- M
- M
- M
- M
- M
- M
-r   