o
    5‘ði�§  ã                   @  s$  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
rKdd	lmZmZ e
s^e ¡ d
kr^ddlZddlmZ nG dd„ dƒZeƒ Zded< G dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ deƒZ G d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                   @  s   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© r   r   úN/root/parts/websockify/install/lib/python3.10/site-packages/setuptools/msvc.pyr   #   s
    r   zdict[str, str]r   c                   @  sp   e Zd ZdZe dd¡ ¡ Zddd	„Ze	dd
d„ƒZ
ddd„Zddd„Zdddd„Zdddd„Zdddd„ZdS )ÚPlatformInfoz�
    Current and Target Architectures information.

    Parameters
    ----------
    arch: str
        Target architecture.
    Úprocessor_architectureÚ ÚarchÚstrÚreturnÚNonec                 C  s   |  ¡  dd¡| _d S )NÚx64Úamd64)ÚlowerÚreplacer   )Úselfr   r   r   r   Ú__init__8   s   zPlatformInfo.__init__c                 C  s   | j | j  d¡d d… S )zs
        Return Target CPU architecture.

        Return
        ------
        str
            Target CPU
        Ú_r   N)r   Úfind©r#   r   r   r   Ú
target_cpu;   s   
zPlatformInfo.target_cpuÚboolc                 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'   r   r   r   Útarget_is_x86G   ó   
	zPlatformInfo.target_is_x86c                 C  r*   )zˆ
        Return True if current CPU is x86 32 bits..

        Return
        ------
        bool
            CPU is x86 32 bits
        r+   ©Úcurrent_cpur'   r   r   r   Úcurrent_is_x86R   r.   zPlatformInfo.current_is_x86Fc                 C  ó0   | j dkr	|r	dS | j dkr|rdS 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ú\r/   ©r#   Úhidex86r   r   r   r   Úcurrent_dir]   ó   ÿÿÿý
ûzPlatformInfo.current_dirc                 C  r2   )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    r3   r4   r,   r5   r   r   r   Ú
target_diru   r8   zPlatformInfo.target_dirc                 C  s4   |rdn| j }| j|krdS |  ¡  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   r4   r%   )r0   r(   r9   r"   )r#   Úforcex86Úcurrentr   r   r   Ú	cross_dir�   s   
ÿÿýzPlatformInfo.cross_dirN)r   r   r   r   ©r   r   )r   r)   )FF©F)r   r   r   Ú__doc__r   Úgetr!   r0   r$   Úpropertyr(   r-   r1   r7   r9   r<   r   r   r   r   r   ,   s    	


r   c                   @  sâ   e Zd ZdZejejejejfZ	d)dd„Z
ed*d	d
„ƒZed*dd„ƒZed*dd„ƒZed*dd„ƒZed*dd„ƒZed*dd„ƒZed*dd„ƒZed*dd„ƒZed*dd„ƒZed+d,dd „ƒZed+d-d"d „ƒZd+d-d#d „Zd.d&d'„Zd(S )/ÚRegistryInfozŸ
    Microsoft Visual Studio related registry information.

    Parameters
    ----------
    platform_info: PlatformInfo
        "PlatformInfo" instance.
    Úplatform_infor   r   r   c                 C  s
   || _ d S ©N)Úpi)r#   rC   r   r   r   r$   ¶   s   
zRegistryInfo.__init__r
   c                 C  ó   dS )z€
        Microsoft Visual Studio root registry key.

        Return
        ------
        str
            Registry key
        ÚVisualStudior   r'   r   r   r   Úvisualstudio¹   ó   
zRegistryInfo.visualstudioc                 C  ó   t j | jd¡S )z
        Microsoft Visual Studio SxS registry key.

        Return
        ------
        str
            Registry key
        ÚSxS)ÚosÚpathÚjoinrH   r'   r   r   r   ÚsxsÅ   ó   
zRegistryInfo.sxsc                 C  rJ   )z|
        Microsoft Visual C++ VC7 registry key.

        Return
        ------
        str
            Registry key
        ÚVC7©rL   rM   rN   rO   r'   r   r   r   ÚvcÑ   rP   zRegistryInfo.vcc                 C  rJ   )z
        Microsoft Visual Studio VS7 registry key.

        Return
        ------
        str
            Registry key
        ÚVS7rR   r'   r   r   r   ÚvsÝ   rP   zRegistryInfo.vsc                 C  rF   )zƒ
        Microsoft Visual C++ for Python registry key.

        Return
        ------
        str
            Registry key
        zDevDiv\VCForPythonr   r'   r   r   r   Úvc_for_pythoné   rI   zRegistryInfo.vc_for_pythonc                 C  rF   )zq
        Microsoft SDK registry key.

        Return
        ------
        str
            Registry key
        zMicrosoft SDKsr   r'   r   r   r   Úmicrosoft_sdkõ   rI   zRegistryInfo.microsoft_sdkc                 C  rJ   )z‚
        Microsoft Windows/Platform SDK registry key.

        Return
        ------
        str
            Registry key
        r   ©rL   rM   rN   rW   r'   r   r   r   Úwindows_sdk  rP   zRegistryInfo.windows_sdkc                 C  rJ   )z€
        Microsoft .NET Framework SDK registry key.

        Return
        ------
        str
            Registry key
        ÚNETFXSDKrX   r'   r   r   r   Ú	netfx_sdk  rP   zRegistryInfo.netfx_sdkc                 C  rF   )z€
        Microsoft Windows Kits Roots registry key.

        Return
        ------
        str
            Registry key
        zWindows Kits\Installed Rootsr   r'   r   r   r   Úwindows_kits_roots  rI   zRegistryInfo.windows_kits_rootsFÚkeyr+   r)   c                 C  ó   d S rD   r   ©r#   r]   r+   r   r   r   Ú	microsoft%  ó   zRegistryInfo.microsoftr   c                 C  r^   rD   r   r_   r   r   r   r`   '  ra   c                 C  s(   | 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)rE   r1   rL   rM   rN   )r#   r]   r+   Únode64r   r   r   r`   )  s   Únameú
str | Nonec           	      C  sð   t j}t j}t j}| j}| jD ]f}d}z||||ƒd|ƒ}W n' tyE   | j ¡ sAz||||dƒd|ƒ}W n ty@   Y Y qw Y qY nw z'zt  	||¡d W W |rZ||ƒ   S   S  tye   Y nw W |rm||ƒ q|ru||ƒ w 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ÚCloseKeyr`   ÚHKEYSÚOSErrorrE   r1   ÚQueryValueEx)	r#   r]   rf   Úkey_readÚopenkeyÚclosekeyÚmsÚhkeyÚbkeyr   r   r   Úlookup<  sD   

ÿüýÿýÿ€ÿ
ÿzRegistryInfo.lookupN)rC   r   r   r   )r   r
   r>   )r]   r
   r+   r)   r   r
   )r]   r   r+   r)   r   r   )r]   r   rf   r   r   rg   )r   r   r   r?   r   r   r   r   r   rk   r$   rA   rH   rO   rS   rU   rV   rW   rY   r[   r\   r   r`   rt   r   r   r   r   rB   ¥   s@    
ü
rB   c                   @  sf  e Zd ZdZe dd¡Ze dd¡Ze de¡Z	dFdGdd„Z	dd„ Z
dHdd„ZdIdd„Zedd„ ƒZedJdd„ƒZedJdd„ƒZdd„ Zd d!„ ZedKd#d$„ƒZedJd%d&„ƒZedJd'd(„ƒZedLd*d+„ƒZedJd,d-„ƒZedLd.d/„ƒZedJd0d1„ƒZedKd2d3„ƒZedLd4d5„ƒZedJd6d7„ƒZedJd8d9„ƒZedMd;d<„ƒZedMd=d>„ƒZ dMd?d@„Z!edNdOdDdE„ƒZ"dS )PÚ
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_inforB   Úvc_verúfloat | Noner   r   c                 C  s2   || _ | j j| _|  ¡ | _|p|  ¡  | _| _d S rD   )ÚrirE   Úfind_programdata_vs_versÚknown_vs_pathsÚ_find_latest_available_vs_verÚvs_verry   )r#   rx   ry   r   r   r   r$   x  s   

zSystemInfo.__init__c                 C  s:   |   ¡ }|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_versr   r   r   r~   ƒ  s   	
ÿz(SystemInfo._find_latest_available_vs_verúlist[float]c                 C  s^  | j j}| j j| j j| j jf}g }t | j j|¡D ]‘\}}zt 	|||ƒdtj
¡}W n	 ty3   Y qw |�l t |¡\}}}	t|ƒD ]*}
t t¡� tt ||
¡d ƒ}||vr^| |¡ W d  ƒ n1 shw   Y  qCt|ƒD ](}
t t¡� tt ||
¡ƒ}||vr‹| |¡ W d  ƒ n1 s•w   Y  qrW d  ƒ n1 s¥w   Y  qt|ƒS )z˜
        Find Microsoft Visual Studio versions available in registry.

        Return
        ------
        list of float
            Versions
        r   N)r{   r`   rS   rV   rU   Ú	itertoolsÚproductrk   r   ri   rh   rl   ÚQueryInfoKeyÚrangeÚ
contextlibÚsuppressÚ
ValueErrorÚfloatÚ	EnumValueÚappendÚEnumKeyÚsorted)r#   rq   ÚvckeysÚvs_versrr   r]   rs   ÚsubkeysÚvaluesr%   ÚiÚverr   r   r   r€   —  s>   	ÿ
€ý€
€ý€ÿù€zSystemInfo.find_reg_vs_versúdict[float, str]c           	   
   C  sÌ   i }d}zt  |¡}W n ty   | Y S w |D ]J}z=t j ||d¡}t|ddd��}t |¡}W d  ƒ n1 s;w   Y  |d }t  t j |d¡¡ |||  |d	 ¡< W q tt	fyc   Y q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)
rL   Úlistdirrl   rM   rN   ÚopenÚjsonÚloadÚ_as_float_versionÚKeyError)	r#   Úvs_versionsÚinstances_dirÚhashed_namesrf   Ú
state_pathÚ
state_fileÚstateÚvs_pathr   r   r   r|   ¶  s*   
þÿÿþz#SystemInfo.find_programdata_vs_versc                 C  s   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‘   rN   Úsplit)Úversionr   r   r   r¦   à  s   zSystemInfo._as_float_versionr   c                 C  s6   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)rL   rM   rN   ÚProgramFilesx86r   r{   rt   rU   )r#   Údefaultr   r   r   ÚVSInstallDirñ  s   ÿzSystemInfo.VSInstallDirc                 C  s0   |   ¡ 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_legacyrL   rM   Úisdirr�   r‚   rƒ   )r#   rM   Úmsgr   r   r   ÚVCInstallDir  s
   
zSystemInfo.VCInstallDirc              	   C  sŠ   | j dkrdS z| j| j  }W n ty   | j}Y nw tj |d¡}zt |¡d }|  |¡| _	tj ||¡W S  t
tfyD   Y dS w )zl
        Locate Visual C++ for VS2017+.

        Return
        ------
        str
            path
        ç      ,@r   r    éÿÿÿÿ)r   r}   r§   r·   rL   rM   rN   r¢   r¦   ry   rl   Ú
IndexError)r#   Úvs_dirÚguess_vcry   r   r   r   r¸     s   
	
þÿzSystemInfo._guess_vcc                 C  st   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›¡p9|S )z{
        Locate Visual C++ for versions prior to 2017.

        Return
        ------
        str
            path
        r³   r´   z\VCÚ
installdirÚVC)	rL   rM   rN   rµ   r   r{   rV   rt   rS   )r#   r¶   Úreg_pathÚ	python_vcÚ
default_vcr   r   r   r¹   3  s   	þzSystemInfo._guess_vc_legacyútuple[LiteralString, ...]c                 C  sJ   | 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'   r   r   r   ÚWindowsSdkVersionI  s   





zSystemInfo.WindowsSdkVersionc                 C  s   |   tj | jd¡¡S )zt
        Microsoft Windows SDK last version.

        Return
        ------
        str
            version
        Úlib)Ú_use_last_dir_namerL   rM   rN   ÚWindowsSdkDirr'   r   r   r   ÚWindowsSdkLastVersion_  s   
z SystemInfo.WindowsSdkLastVersionc                 C  s<  d}| j D ]}tj | jjd|› �¡}| j |d¡}|r nq|r'tj |¡sCtj | jj| j	d›¡}| j |d¡}|rCtj |d¡}|rKtj |¡so| j D ] }|d| 
d¡… }d	|› �}tj | j|¡}tj |¡rn|}qN|rwtj |¡s’| j D ]}d
|› �}tj | j|¡}tj |¡r‘|}qz|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Î   rL   rM   rN   r{   rY   rt   rº   rV   ry   Úrfindrw   r¼   )r#   Úsdkdirr›   ÚlocrM   Úinstall_baseÚintverÚdr   r   r   rÑ   k  s<   

ÿ

€

€zSystemInfo.WindowsSdkDirrg   c           	      C  sÜ   | j dkr
d}d}nd}| j dkrdnd}| jjd|d� d	d
¡}d|› d|› �}g }| j dkrC| jD ]}|tj | jj	||¡g7 }q3| j
D ]}|tj | jjd|› d�|¡g7 }qF|D ]}| j |d¡}|rk|  S q\dS )z€
        Microsoft Windows SDK executable directory.

        Return
        ------
        str | None
            path
        rÊ   é#   r   é(   rË   TF)r   r6   r4   ú-zWinSDK-NetFxÚToolsr½   rÓ   ÚArÔ   N)r   rE   r7   r"   ÚNetFxSdkVersionrL   rM   rN   r{   r[   rÎ   rY   rt   )	r#   Únetfxverr   r6   ÚfxÚregpathsr›   rM   Úexecpathr   r   r   ÚWindowsSDKExecutablePath–  s&   



$ÿz#SystemInfo.WindowsSDKExecutablePathc                 C  s.   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   )rL   rM   rN   r{   rH   r   rt   )r#   rM   r   r   r   ÚFSharpInstallDir»  s   
zSystemInfo.FSharpInstallDirc                 C  sD   | j dkrdnd}|D ]}| j | jjd|› �¡}|r|  S qdS )z{
        Microsoft Universal CRT SDK directory.

        Return
        ------
        str | None
            path
        r½   )Ú10Ú81r   ÚkitsrootN)r   r{   rt   r\   )r#   Úversr›   rØ   r   r   r   ÚUniversalCRTSdkDirÈ  s   ÿzSystemInfo.UniversalCRTSdkDirc              
   C  s@   z|   tj | jd¡¡W S  ty } zt |d¡ ‚ d}~ww )z€
        Microsoft Universal C Runtime SDK last version.

        Return
        ------
        str
            version
        rÏ   úCannot find UniversalCRTSdkDirN)rÐ   rL   rM   rN   rî   Ú	TypeErrorr	   Úadd_note)r#   Úexr   r   r   ÚUniversalCRTSdkLastVersionÝ  s   
€þz%SystemInfo.UniversalCRTSdkLastVersionc                 C  s   | j dkrdS 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'   r   r   r   râ   í  s
   
ÿÿýzSystemInfo.NetFxSdkVersionc                 C  s>   d}| j D ]}tj | jj|¡}| j |d¡}|r |S q|S )z|
        Microsoft .NET Framework SDK directory.

        Return
        ------
        str | None
            path
        r   Úkitsinstallationfolder)râ   rL   rM   rN   r{   r[   rt   )r#   rØ   r›   rÙ   r   r   r   ÚNetFxSdkDirþ  s   

þzSystemInfo.NetFxSdkDirc                 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©rL   rM   rN   rv   r{   rt   rS   ©r#   Úguess_fwr   r   r   ÚFrameworkDir32  ó   zSystemInfo.FrameworkDir32c                 C  rö   )zw
        Microsoft .NET Framework 64bit directory.

        Return
        ------
        str
            path
        zMicrosoft.NET\Framework64Úframeworkdir64rø   rù   r   r   r   ÚFrameworkDir64   rü   zSystemInfo.FrameworkDir64útuple[str, ...]c                 C  ó
   |   d¡S )zƒ
        Microsoft .NET Framework 32bit versions.

        Return
        ------
        tuple of str
            versions
        é    ©Ú_find_dot_net_versionsr'   r   r   r   ÚFrameworkVersion320  ó   

zSystemInfo.FrameworkVersion32c                 C  r   )zƒ
        Microsoft .NET Framework 64bit versions.

        Return
        ------
        tuple of str
            versions
        é@   r  r'   r   r   r   ÚFrameworkVersion64<  r  zSystemInfo.FrameworkVersion64c                 C  sœ   | 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dfS |dfS | jdkrEdS | jdkrLd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{   rt   rS   ÚgetattrrÐ   r   r!   )r#   ÚbitsÚreg_verÚdot_net_dirr›   r   r   r   r  H  s   

$

z!SystemInfo._find_dot_net_versionsrM   r   Úprefixc                   s(   ‡ ‡fdd„t t ˆ ¡ƒ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  s4   � | ]}t j t j ˆ |¡¡r| ˆ¡r|V  qd S rD   )rL   rM   rº   rN   Ú
startswith)Ú.0Údir_name©rM   r  r   r   Ú	<genexpr>w  s   € ýü
ÿz0SystemInfo._use_last_dir_name.<locals>.<genexpr>r   )ÚreversedrL   r¢   Únext)rM   r  Úmatching_dirsr   r  r   rÐ   f  s   þ
zSystemInfo._use_last_dir_namerD   )rx   rB   ry   rz   r   r   )r   r‰   )r   rœ   r=   )r   rÇ   ©r   rg   )r   rÿ   )r   )rM   r   r  r   r   r   )#r   r   r   r?   r   r@   rv   rw   rµ   r$   r~   r€   r|   Ústaticmethodr¦   rA   r·   r¼   r¸   r¹   rÎ   rÒ   rÑ   rç   ré   rî   ró   râ   rõ   rû   rþ   r  r  r  rÐ   r   r   r   r   ru   f  s^    ÿ

*
*$
ru   c                   @  s6   e Zd ZU ded< ded< ded< ded< ded< dS )	Ú_EnvironmentDictr   ÚincluderÏ   ÚlibpathrM   zNotRequired[str | None]Úpy_vcruntime_redistN)r   r   r   Ú__annotations__r   r   r   r   r  €  s   
 r  c                   @  sb  e Zd ZdZdEdFd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„ ƒZedd„ ƒZdd„ ZedGd!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/d0„ ƒZedHd2d3„ƒZedHd4d5„ƒZedGd6d7„ƒZed8d9„ ƒZedId;d<„ƒZdJdKdAdB„ZdCdD„ Z dS )LÚ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                 C  sB   t |ƒ| _t| jƒ| _t| j|ƒ| _| j|k rd}tj 	|¡‚d S )Nz.No suitable Microsoft Visual C++ version found)
r   rE   rB   r{   ru   Úsiry   r�   r‚   rƒ   )r#   r   ry   Ú
vc_min_verÚerrr   r   r   r$      s   

þzEnvironmentInfo.__init__c                 C  ó   | j jS )zk
        Microsoft Visual Studio.

        Return
        ------
        float
            version
        )r"  r   r'   r   r   r   r   ©  ó   
zEnvironmentInfo.vs_verc                 C  r%  )zp
        Microsoft Visual C++ version.

        Return
        ------
        float
            version
        )r"  ry   r'   r   r   r   ry   µ  r&  zEnvironmentInfo.vc_verc                   sX   ddg}ˆ j dkr#ˆ jjddd�}|dg7 }|dg7 }|d|› �g7 }‡ fdd	„|D ƒS )
zu
        Microsoft Visual Studio Tools.

        Return
        ------
        list of str
            paths
        zCommon7\IDEzCommon7\Toolsr½   T©r6   r   z1Common7\IDE\CommonExtensions\Microsoft\TestWindowzTeam Tools\Performance Toolsc                   ó   g | ]}t j ˆ jj|¡‘qS r   ©rL   rM   rN   r"  r·   ©r  rM   r'   r   r   Ú
<listcomp>Ó  ó    z+EnvironmentInfo.VSTools.<locals>.<listcomp>)r   rE   r7   )r#   ÚpathsÚarch_subdirr   r'   r   ÚVSToolsÁ  s   



zEnvironmentInfo.VSToolsc                 C  s$   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©rL   rM   rN   r"  r¼   r'   r   r   r   Ú
VCIncludesÕ  s   þzEnvironmentInfo.VCIncludesc                   sh   ˆ j dkrˆ jjdd�}nˆ jjdd�}d|› �d|› �g}ˆ j dkr+|d|› �g7 }‡ fd	d
„|D ƒS )z“
        Microsoft Visual C++ & Microsoft Foundation Class Libraries.

        Return
        ------
        list of str
            paths
        ç      .@T©r   ©r6   ÚLibz
ATLMFC\Libr½   z	Lib\storec                   r(  r   r1  r*  r'   r   r   r+  ÷  r,  z/EnvironmentInfo.VCLibraries.<locals>.<listcomp>)r   rE   r9   )r#   r.  r-  r   r'   r   ÚVCLibrariesä  s   


zEnvironmentInfo.VCLibrariesc                 C  ó"   | 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   rL   rM   rN   r"  r¼   r'   r   r   r   ÚVCStoreRefsù  s   

zEnvironmentInfo.VCStoreRefsc                 C  s8  | j }tj |jd¡g}| jdkrdnd}| j |¡}|r+|tj |jd|› �¡g7 }| jdkrGd| jjdd�› �}|tj |j|¡g7 }|S | jdkr�| jj	 
d	d
¡ ¡ }tj dd|› d�¡}|tj |j|| jjdd� ¡g7 }| jj	| jjkr�|tj |j|| jjdd� ¡g7 }|S |tj |jd¡g7 }|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½   r5  r3  r    r   ÚbinÚHostz%sr4  )r"  rL   rM   rN   r¼   r   rE   r<   r7   r0   r"   Úupperr9   r(   )r#   r"  Útoolsr:   r.  rM   Úhost_idÚhost_dirr   r   r   ÚVCTools  s2   

ïÿÿÿ	þzEnvironmentInfo.VCToolsc                 C  st   | j dkr| jjddd�}tj | jjd|› �¡gS | jjdd�}tj | jjd¡}| j}tj ||› d|› �¡gS )zw
        Microsoft Windows SDK Libraries.

        Return
        ------
        list of str
            paths
        rÉ   Tr'  r6  r4  rÏ   Úum)	r   rE   r9   rL   rM   rN   r"  rÑ   Ú_sdk_subdir)r#   r.  rÏ   Úlibverr   r   r   ÚOSLibraries:  s   

zEnvironmentInfo.OSLibrariesc                 C  s~   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
        r  rÉ   Úglr½   r   ÚsharedrC  Úwinrt)rL   rM   rN   r"  rÑ   r   rD  )r#   r  Úsdkverr   r   r   Ú
OSIncludesN  s   


ýzEnvironmentInfo.OSIncludesc                 C  sº   t j | jjd¡}g }| jdkr|| j7 }| jdkr$|t j |d¡g7 }| 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7 }|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)rL   rM   rN   r"  rÑ   r   rF  )r#   Úrefr  r   r   r   Ú	OSLibpathh  s4   




ÿùøzEnvironmentInfo.OSLibpathc                 C  s   t |  ¡ ƒS )zs
        Microsoft Windows SDK Tools.

        Return
        ------
        list of str
            paths
        )ÚlistÚ
_sdk_toolsr'   r   r   r   ÚSdkTools�  s   
zEnvironmentInfo.SdkToolsc                 c  s  � | j dk r| j dkrdnd}tj | jj|¡V  | j ¡ s4| jjdd�}d|› �}tj | jj|¡V  | j dv rY| j 	¡ rAd}n| jjddd	�}d
|› �}tj | jj|¡V  n%| j dkr~tj | jjd¡}| jjd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
        r3  rÊ   r;  zBin\x86Tr4  )rÉ   rÊ   r   r'  zBin\NETFX 4.0 ToolsN)r   rL   rM   rN   r"  rÑ   rE   r1   r7   r-   rÒ   rç   )r#   Úbin_dirr.  rM   rJ  r   r   r   rT  œ  s,   €
	





ÿzEnvironmentInfo._sdk_toolsr   c                 C  ó   | j j}|r|› d�S dS )zu
        Microsoft Windows SDK version subdir.

        Return
        ------
        str
            subdir
        r4   r   )r"  rÒ   ©r#   Úucrtverr   r   r   rD  ¿  ó   
zEnvironmentInfo._sdk_subdirc                 C  s"   | 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   rL   rM   rN   r"  rÑ   r'   r   r   r   ÚSdkSetupÌ  ó   

zEnvironmentInfo.SdkSetupc                   s”   | j }| j‰ | jdkrd}| ¡  o| ¡  }n| ¡ p| ¡ }|jdkp)|jdk}g }|r:|‡ fdd„ˆ jD ƒ7 }|rH|‡ fdd„ˆ jD ƒ7 }|S )zv
        Microsoft .NET Framework Tools.

        Return
        ------
        list of str
            paths
        rÉ   Tr    c                   ó   g | ]
}t j ˆ j|¡‘qS r   )rL   rM   rN   rû   ©r  r›   ©r"  r   r   r+  ñ  ó    ÿz+EnvironmentInfo.FxTools.<locals>.<listcomp>c                   r^  r   )rL   rM   rN   rþ   r_  r`  r   r   r+  õ  ra  )	rE   r"  r   r-   r1   r0   r(   r  r  )r#   rE   Ú	include32Ú	include64r?  r   r`  r   ÚFxToolsÛ  s"   

ÿÿzEnvironmentInfo.FxToolsc                 C  s>   | j dk s	| jjsg S | jjdd�}tj | jjd|› �¡gS )z~
        Microsoft .Net Framework SDK Libraries.

        Return
        ------
        list of str
            paths
        r½   Tr4  zlib\um)r   r"  rõ   rE   r9   rL   rM   rN   )r#   r.  r   r   r   ÚNetFxSDKLibrariesú  s   
z!EnvironmentInfo.NetFxSDKLibrariesc                 C  s*   | 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õ   rL   rM   rN   r'   r   r   r   ÚNetFxSDKIncludes
  s   
z EnvironmentInfo.NetFxSDKIncludesc                 C  s   t j | jjd¡gS )z„
        Microsoft Visual Studio Team System Database.

        Return
        ------
        list of str
            paths
        zVSTSDB\Deployr)  r'   r   r   r   ÚVsTDb  s   
zEnvironmentInfo.VsTDbc                 C  s„   | j dk rg S | j dk r| jj}| jjdd�}n| jj}d}d| j d›d|› �}tj ||¡g}| j dkr@|tj ||d	¡g7 }|S )
zn
        Microsoft Build Engine.

        Return
        ------
        list of str
            paths
        rË   r3  Tr5  r   zMSBuild\r´   z\binÚRoslyn)	r   r"  rµ   rE   r7   r·   rL   rM   rN   )r#   Ú	base_pathr.  rM   Úbuildr   r   r   ÚMSBuild%  s   



zEnvironmentInfo.MSBuildc                 C  r8  )zt
        Microsoft HTML Help Workshop.

        Return
        ------
        list of str
            paths
        rÊ   zHTML Help Workshop)r   rL   rM   rN   r"  rµ   r'   r   r   r   ÚHTMLHelpWorkshopA  r]  z EnvironmentInfo.HTMLHelpWorkshopú	list[str]c              
   C  sz   | j dk rg S | jjdd�}ztj | jjd¡}W n ty, } zt	 
|d¡ ‚ d}~ww | j}tj ||› d|› �¡gS )zƒ
        Microsoft Universal C Runtime SDK Libraries.

        Return
        ------
        list of str
            paths
        r½   Tr4  rÏ   rï   NÚucrt)r   rE   r9   rL   rM   rN   r"  rî   rð   r	   rñ   Ú_ucrt_subdir)r#   r.  rÏ   rò   rY  r   r   r   ÚUCRTLibrariesP  s   

€þzEnvironmentInfo.UCRTLibrariesc              
   C  sd   | j dk rg S ztj | jjd¡}W n ty% } zt |d¡ ‚ d}~ww tj || j	› d�¡gS )z�
        Microsoft Universal C Runtime SDK Include.

        Return
        ------
        list of str
            paths
        r½   r  rï   Nrn  )
r   rL   rM   rN   r"  rî   rð   r	   rñ   ro  )r#   r  rò   r   r   r   ÚUCRTIncludesf  s   

€þzEnvironmentInfo.UCRTIncludesc                 C  rW  )z�
        Microsoft Universal C Runtime SDK version subdir.

        Return
        ------
        str
            subdir
        r4   r   )r"  ró   rX  r   r   r   ro  z  rZ  zEnvironmentInfo._ucrt_subdirc                 C  s$   d| j   krdkrg S  | jjgS )zk
        Microsoft Visual F#.

        Return
        ------
        list of str
            paths
        rÊ   rË   )r   r"  ré   r'   r   r   r   ÚFSharp‡  s   
ÿ
zEnvironmentInfo.FSharprg   c                   sè   d| j › d�‰| jjdd� d¡‰ g }| jj}tj | 	dd¡¡}tj 
|¡r>tj |t |¡d ¡}||tj |d	¡g7 }|tj |d
¡g7 }d| j d › d�dt| jƒd › d�f}‡ ‡fdd„t ||¡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.dllTr4  r4   z\Toolsz\Redistr¾   ÚonecoreÚredistzMicrosoft.VCé
   z.CRTc                 3  s&   � | ]\}}t j |ˆ |ˆ¡V  qd S rD   )rL   rM   rN   )r  r  Úcrt_dir©r.  rs  r   r   r  ³  s
   € ÿ
ÿz2EnvironmentInfo.VCRuntimeRedist.<locals>.<genexpr>N)ry   rE   r9   Ústripr"  r¼   rL   rM   Údirnamer"   rº   rN   r¢   Úintr   rŠ   r‹   r  ÚfilterÚisfile)r#   ÚprefixesÚ
tools_pathÚredist_pathÚcrt_dirsÚcandidate_pathsr   rx  r   ÚVCRuntimeRedist–  s    ý
þzEnvironmentInfo.VCRuntimeRedistTÚexistsr)   r  c                 C  s®   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	|¡d�}| jdkrU| jrU| j|d< |S )zÛ
        Return environment dict.

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

        Return
        ------
        dict
            environment
        r  rÏ   r  rM   )r  rÏ   r  rM   é   r  )r  Ú_build_pathsr2  rK  rq  rf  r7  rF  rd  rp  re  r9  rR  rB  r/  rg  rU  r\  rk  rl  rr  r   rƒ  )r#   r„  Úenvr   r   r   Ú
return_env¹  sV   üø
û÷ý÷óå+
zEnvironmentInfo.return_envc           
      C  sx   t j |¡}t |d¡ tj¡}t  ||¡}|r!tt	tj
j|ƒƒn|}|s2| ¡ › 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   r@   r±   rL   ÚpathseprS  r|  rM   rº   r>  r�   r‚   rƒ   r   rN   )
r#   rf   Úspec_path_listsr„  Ú
spec_pathsÚ	env_pathsr-  Úextant_pathsr»   Úunique_pathsr   r   r   r†  ö  s   zEnvironmentInfo._build_paths)Nr   )r   r   r=   )r   rm  r  )T)r„  r)   r   r  )!r   r   r   r?   r$   rA   r   ry   r/  r2  r7  r9  rB  rF  rK  rR  rU  rT  rD  r\  rd  re  rf  rg  rk  rl  rp  rq  ro  rr  rƒ  rˆ  r†  r   r   r   r   r!  ˆ  sl    	






2


'
#







"=r!  )"r?   Ú
__future__r   rŽ   rŠ   r¤   rL   Úos.pathÚplatformÚtypingr   r   r   Úmore_itertoolsr   Ú_pathr   Úcompatr	   Údistutils.errorsr�   Útyping_extensionsr
   r   Úsystemr   r   Údictr   r   rB   ru   r  r!  r   r   r   r   Ú<module>   s<    y B    