
    5h                    |   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 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)unique_everseen)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     /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             Z
d Zd	 ZdddZdddZddZdS )PlatformInfoz
    Current and Target Architectures information.

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

        Return
        ------
        str
            Target CPU
        _   N)r"   findr#   s    r   
target_cpuzPlatformInfo.target_cpu8   s*     y,,q02233r   c                    | 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_x86D   s     %''r   c                    | j         dk    S )z
        Return True if current CPU is x86 32 bits..

        Return
        ------
        bool
            CPU is x86 32 bits
        r,   current_cpur)   s    r   current_is_x86zPlatformInfo.current_is_x86O   s     5((r   Fstrc                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)
        r,   r   r   \x64\r0   r#   hidex86r   s      r   current_dirzPlatformInfo.current_dirZ   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)
        r,   r   r   r5   r6   r-   r7   s      r   
target_dirzPlatformInfo.target_dirr   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.
        r,   r   r6   r&   )r1   r*   r;   r!   )r#   forcex86currents      r   	cross_dirzPlatformInfo.cross_dir   sU      $9%%)9 ')) B""**4gAA	
r   Nr   r   )FFr   r3   F)r   r   r   __doc__r
   getr    r1   r$   propertyr*   r.   r2   r9   r;   r?   r   r   r   r   r   )   s          '+6;;AACCK9 9 9 9 	4 	4 X	4	( 	( 	(	) 	) 	)
 
 
 
 
0
 
 
 
 
0
 
 
 
 
 
r   r   c                  *   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             Zed             Zed	             Zedd
            Zedd            Zed             Zed             Zedd            ZddZd ZdS )RegistryInfoz
    Microsoft Visual Studio related registry information.

    Parameters
    ----------
    platform_info: PlatformInfo
        "PlatformInfo" instance.
    r   r   c                    || _         d S N)pi)r#   platform_infos     r   r$   zRegistryInfo.__init__   s    r   r3   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joinrN   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rQ   rR   rS   rT   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
        VS7rW   r)   s    r   vszRegistryInfo.vs   rY   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	   rQ   rR   rS   r`   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
        NETFXSDKrb   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   Fc                    | 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: str
            Force x86 software registry.

        Return
        ------
        str
            Registry key
        r   Wow6432NodeSoftware	Microsoft)rJ   r2   rQ   rR   rS   )r#   keyr,   node64s       r   	microsoftzRegistryInfo.microsoft"  s?      w--//I3IMw||JSAAAr   c           	        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
            value
        Nr   T)
r   KEY_READOpenKeyCloseKeyro   HKEYSOSErrorrJ   r2   QueryValueEx)	r#   rm   namekey_readopenkeyclosekeymshkeybkeys	            r   lookupzRegistryInfo.lookup5  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Nr@   rA   rB   )r   r   r   rC   r   r   r   r   r   rt   r$   rE   rN   rT   rX   r\   r^   r`   rc   rf   rh   ro   r~   r   r   r   rG   rG      s         	 ! 	E        	 	 	 X	 	6 	6 X	6 	- 	- X	- 	- 	- X	- 	% 	% 	% X	% 	  	  	  X	  	; 	; X	; 	< 	< X	< 	/ 	/ 	/ X	/B B B B&' ' ' ' 'r   rG   c                  *   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
d Zd'dZed             Zed             Zed             Zd Zd Zed(d            Ze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             Zed*d!            Zed*d"            Z d*d#Z!ed+d$            Z"dS ),
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)Nr   r   c                    || _         | j         j        | _        |                                 | _        |p|                                 x| _        | _        d S rI   )rirJ   find_programdata_vs_versknown_vs_paths_find_latest_available_vs_vervs_vervc_ver)r#   registry_infor   s      r   r$   zSystemInfo.__init__q  sM    '*";;== %+$Rd.P.P.R.RRdkkkr   c                    |                                  }|s&| j        st          j                            d          t          |          }|                    | j                   t          |          d         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sorted)r#   reg_vc_versvc_verss      r   r   z(SystemInfo._find_latest_available_vs_verz  sz     ++-- 	t2 	"997   k""t*+++gr""r   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   rX   r^   r\   	itertoolsproductrt   r   rr   rq   ru   QueryInfoKeyrange
contextlibsuppress
ValueErrorfloat	EnumValueappendEnumKeyr   )r#   r{   vckeysvs_versr|   rm   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)
rQ   listdirru   rR   rS   openjsonload_as_float_versionKeyError)	r#   vs_versionsinstances_dirhashed_namesrw   
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   rS   split)versions    r   r   zSystemInfo._as_float_version  s3     SXXgmmC00!455666r   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)rQ   rR   rS   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_legacyrQ   rR   isdirr   r   r   )r#   rR   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   r   rQ   rR   rS   r   r   r   ru   
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)	rQ   rR   rS   r   r   r   r^   r~   rX   )r#   r   reg_path	python_vc
default_vcs        r   r   zSystemInfo._guess_vc_legacy*  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.WindowsSdkVersion@  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_namerQ   rR   rS   WindowsSdkDirr)   s    r   WindowsSdkLastVersionz SystemInfo.WindowsSdkLastVersionV  s+     &&rw||D4F'N'NOOOr   
str | Nonec                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   rQ   rR   rS   r   rc   r~   r   r^   r   rfindr   r   )r#   sdkdirr   locrR   install_baseintverds           r   r   zSystemInfo.WindowsSdkDirb  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   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 )zy
        Microsoft Windows SDK executable directory.

        Return
        ------
        str
            path
        r   #   r   (   r   TF)r   r8   r6   -zWinSDK-NetFxToolsr   r   Ar   N)r   rJ   r9   r!   NetFxSdkVersionrQ   rR   rS   r   rf   r   rc   r~   )	r#   netfxverr"   r8   fxregpathsr   rR   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   )rQ   rR   rS   r   rN   r   r~   )r#   rR   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 ]2}| j                            | j        j        d|           }|r|pdc S 3dS )zt
        Microsoft Universal CRT SDK directory.

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

        Return
        ------
        str
            version
        r   )r   rQ   rR   rS   r  r)   s    r   UniversalCRTSdkLastVersionz%SystemInfo.UniversalCRTSdkLastVersion  s+     &&rw||D4KU'S'STTTr   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 )zu
        Microsoft .NET Framework SDK directory.

        Return
        ------
        str
            path
        r   kitsinstallationfolder)r   rQ   rR   rS   r   rf   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rQ   rR   rS   r   r   r~   rX   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.FrameworkVersion32#       **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   )r$  
v2.0.50727g       @)zv3.0r%  r   )r   r~   rX   getattrr   r   r    )r#   bitsreg_verdot_net_dirr   s        r   r  z!SystemInfo._find_dot_net_versions;  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   c                      fdt          t          j                             D             }t          |d          pdS )a)  
        Return name of the last dir in path or '' if no dir found.

        Parameters
        ----------
        path: str
            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 rI   )rQ   rR   r   rS   
startswith).0dir_namerR   prefixs     r   	<genexpr>z0SystemInfo._use_last_dir_name.<locals>.<genexpr>j  ss       
 
w}}RW\\$99::
 ##F++	

 
 
 
 
 
r   Nr   )reversedrQ   r   next)rR   r/  matching_dirss   `` r   r   zSystemInfo._use_last_dir_nameY  sZ    "
 
 
 
 
$RZ%5%566
 
 
 M4((.B.r   rI   r@   )r   r   )r   r   r   r   )r   r  )r   )#r   r   r   rC   r
   rD   r   r   r   r$   r   r   r   staticmethodr   rE   r   r   r   r   r   r   r   r   r   r  r  r   r  r  r  r  r  r  r   r   r   r   r   r   _  s       	 	 W[2&&F7;~r22L!gk"5|DDOS S S S S# # #(  >( ( ( (T 7 7 \7  L L XL"   X"  <O O O,    X* 	P 	P X	P ( ( ( X(T " " X"H 
8 
8 X
8   X( 	U 	U X	U 
 
 X
    X" H H X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 )	_EnvironmentDictr3   includer   libpathrR   zNotRequired[str | None]py_vcruntime_redistN)r   r   r   __annotations__r   r   r   r7  r7  s  sB         LLLHHHLLLIII000000r   r7  c                  D   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             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ed)d             Zd*d+d%Zd& Z dS ),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   rJ   rG   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
        )r?  r   r)   s    r   r   zEnvironmentInfo.vs_ver       w~r   c                    | j         j        S )zp
        Microsoft Visual C++ version.

        Return
        ------
        float
            version
        )r?  r   r)   s    r   r   zEnvironmentInfo.vc_ver  rC  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r8   r   z1Common7\IDE\CommonExtensions\Microsoft\TestWindowzTeam Tools\Performance Toolsc                d    g | ],}t           j                            j        j        |          -S r   rQ   rR   rS   r?  r   r-  rR   r#   s     r   
<listcomp>z+EnvironmentInfo.VSTools.<locals>.<listcomp>  .    KKKTTW1488KKKr   )r   rJ   r9   )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rQ   rR   rS   r?  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   r8   Libz
ATLMFC\Libr   z	Lib\storec                d    g | ],}t           j                            j        j        |          -S r   rQ  rI  s     r   rJ  z/EnvironmentInfo.VCLibraries.<locals>.<listcomp>  rK  r   )r   rJ   r;   )r#   rM  rL  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   rQ   rR   rS   r?  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   rV  rT  r   r   binHostz%srU  )r?  rQ   rR   rS   r   r   rJ   r?   r9   r1   r!   upperr;   r*   )r#   r?  toolsr=   rM  rR   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   TrF  rW  rU  r   um)	r   rJ   r;   rQ   rR   rS   r?  r   _sdk_subdir)r#   rM  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
        r8  r   glr   r   sharedrg  winrt)rQ   rR   rS   r?  r   r   rh  )r#   r8  sdkvers      r   
OSIncludeszEnvironmentInfo.OSIncludesA  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)rQ   rR   rS   r?  r   r   rj  )r#   refr9  s      r   	OSLibpathzEnvironmentInfo.OSLibpath[  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
        rT  r   r^  zBin\x86TrU  )r   r   r   rF  zBin\NETFX 4.0 ToolsN)r   rQ   rR   rS   r?  r   rJ   r2   r9   r.   r   r   )r#   bin_dirrM  rR   ro  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   c                ,    | j         j        }|r| dndS )zu
        Microsoft Windows SDK version subdir.

        Return
        ------
        str
            subdir
        r6   r   )r?  r   r#   ucrtvers     r   rh  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   rQ   rR   rS   r?  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   )rQ   rR   rS   r  r-  r   r?  s     r   rJ  z+EnvironmentInfo.FxTools.<locals>.<listcomp>  9       9<R.44  r   c                Z    g | ]'}t           j                            j        |          (S r   )rQ   rR   rS   r  r  s     r   rJ  z+EnvironmentInfo.FxTools.<locals>.<listcomp>  r  r   )	rJ   r?  r   r.   r2   r1   r*   r  r  )r#   rJ   	include32	include64rb  r?  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   TrU  zlib\um)r   r?  r  rJ   r;   rQ   rR   rS   )r#   rM  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   r?  r  rQ   rR   rS   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\DeployrH  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   rT  TrV  r   zMSBuild\r   z\binRoslyn)	r   r?  r   rJ   r9   r   rQ   rR   rS   )r#   	base_pathrM  rR   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   rQ   rR   rS   r?  r   r)   s    r   HTMLHelpWorkshopz EnvironmentInfo.HTMLHelpWorkshop4  s5     ;ITW46JKKLLr   c                    | j         dk     rg S | j                            d          }t          j                            | j        j        d          }| j        }t          j                            || d|           gS )z
        Microsoft Universal C Runtime SDK Libraries.

        Return
        ------
        list of str
            paths
        r   TrU  r   ucrt)	r   rJ   r;   rQ   rR   rS   r?  r  _ucrt_subdir)r#   rM  r   r  s       r   UCRTLibrarieszEnvironmentInfo.UCRTLibrariesC  sw     ;Ig((T(22gll475u==#SW"?"?+"?"?@@AAr   c                    | j         dk     rg S t          j                            | j        j        d          }t          j                            || j         d          gS )z
        Microsoft Universal C Runtime SDK Include.

        Return
        ------
        list of str
            paths
        r   r8  r  )r   rQ   rR   rS   r?  r  r  )r#   r8  s     r   UCRTIncludeszEnvironmentInfo.UCRTIncludesU  sU     ;I',,tw99EEW):&@&@&@AABBr   c                ,    | j         j        }|r| dndS )z
        Microsoft Universal C Runtime SDK version subdir.

        Return
        ------
        str
            subdir
        r6   r   )r?  r  r  s     r   r  zEnvironmentInfo._ucrt_subdire  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   r?  r   r)   s    r   FSharpzEnvironmentInfo.FSharpr  s;     $+$$$$$$$$$I())r   r   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.dllTrU  r6   z\Toolsz\Redistr   onecoreredistzMicrosoft.VC
   z.CRTc              3  b   K   | ])\  }}t           j                            ||          V  *d S rI   )rQ   rR   rS   )r-  r/  crt_dirrM  r  s      r   r0  z2EnvironmentInfo.VCRuntimeRedist.<locals>.<genexpr>  sO       
 
! GLLgyAA
 
 
 
 
 
r   N)r   rJ   r;   stripr?  r   rQ   rR   dirnamer!   r   rS   r   intr   r   r   r2  filterisfile)r#   prefixes
tools_pathredist_pathcrt_dirscandidate_pathsrM  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existsboolr7  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
        r8  r   r9  rR   )r8  r   r9  rR      r:  )r7  _build_pathsrR  rp  r  r  rY  rj  r  r  r  r[  rx  re  rN  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
   rD   r   rQ   pathseprz  r  rR   r   ra  r   r   r   r   rS   )
r#   rw   spec_path_listsr  
spec_paths	env_pathsrL  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@   r4  )T)r  r  r   r7  )!r   r   r   rC   r$   rE   r   r   rN  rR  rY  r[  re  rj  rp  rx  r|  r{  rh  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r=  r=  {  s"        .? ? ? ? ? 	 	 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 X
3 > > X>   X< L L XL B B XB 	F 	F X	F   X6 M M XM B B XB" C C XC 
3 
3 X
3 * * X*  C  C  C X CD; ; ; ; ;z- - - - -r   r=  )rC   
__future__r   r   r   r   rQ   os.pathplatformtypingr   r   more_itertoolsr   distutils.errorsr   typing_extensionsr   r   systemr   r
   dictr;  r   rG   r   r7  r=  r   r   r   <module>r     s0     # " " " " "          				   + + + + + + + + * * * * * *     =<<<<<<<<  %**i77MMM! ! ! ! ! ! ! ! #dffG$$$$v
 v
 v
 v
 v
 v
 v
 v
rz z z z z z z zzQ/ Q/ Q/ Q/ Q/ Q/ Q/ Q/h1 1 1 1 1y 1 1 1E
- E
- E
- E
- E
- E
- E
- E
- E
- E
-r   