U
    aÊ¹j„Ÿ  ã                   @  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
 ddlmZ ddl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ƒZdS )zo
Environment info about Microsoft Compilers.

>>> getfixture('windows_only')
>>> ei = EnvironmentInfo('amd64')
é    )ÚannotationsN)ÚTYPE_CHECKING)Úunique_everseenÚ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/var/www/html/bwave/python/venv/lib/python3.8/site-packages/setuptools/msvc.pyr      s   r   zdict[str, str]r   c                   @  sb   e Zd ZdZe 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.
    Zprocessor_architectureÚ c                 C  s   |  ¡  dd¡| _d S )NÚx64Úamd64)ÚlowerÚreplaceÚarch)Úselfr   r   r   r   Ú__init__2   s    zPlatformInfo.__init__c                 C  s   | j | j  d¡d d… S )zs
        Return Target CPU architecture.

        Return
        ------
        str
            Target CPU
        Ú_é   N)r   Úfind©r   r   r   r   Ú
target_cpu5   s    
zPlatformInfo.target_cpuc                 C  s
   | 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_x86A   s    	zPlatformInfo.target_is_x86c                 C  s
   | j dkS )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_x86L   s    	zPlatformInfo.current_is_x86Fc                 C  s.   | 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ú\%sr"   ©r   Úhidex86r   r   r   r   Úcurrent_dirW   s    ÿÿÿÿûzPlatformInfo.current_dirc                 C  s.   | j dkr|rdS | j dkr$|r$dS 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   r%   r&   r    r'   r   r   r   Ú
target_diro   s    ÿÿÿÿûzPlatformInfo.target_dirc                 C  s0   |rdn| j }| j|krdS |  ¡  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   ú\z\%s_)r#   r   r*   r   )r   Úforcex86Úcurrentr   r   r   Ú	cross_dir‡   s
    ÿýzPlatformInfo.cross_dirN)FF)FF)F)r   r	   r
   Ú__doc__r   Úgetr   r#   r   Úpropertyr   r!   r$   r)   r*   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„ 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d„Zdd„ ZdS )ÚRegistryInfozŸ
    Microsoft Visual Studio related registry information.

    Parameters
    ----------
    platform_info: PlatformInfo
        "PlatformInfo" instance.
    c                 C  s
   || _ d S ©N)Úpi)r   Zplatform_infor   r   r   r   °   s    zRegistryInfo.__init__c                 C  s   dS )z€
        Microsoft Visual Studio root registry key.

        Return
        ------
        str
            Registry key
        ZVisualStudior   r   r   r   r   Úvisualstudio³   s    
zRegistryInfo.visualstudioc                 C  s   t j | jd¡S )z
        Microsoft Visual Studio SxS registry key.

        Return
        ------
        str
            Registry key
        ZSxS)ÚosÚpathÚjoinr5   r   r   r   r   Úsxs¿   s    
zRegistryInfo.sxsc                 C  s   t j | jd¡S )z|
        Microsoft Visual C++ VC7 registry key.

        Return
        ------
        str
            Registry key
        ZVC7©r6   r7   r8   r9   r   r   r   r   ÚvcË   s    
zRegistryInfo.vcc                 C  s   t j | jd¡S )z
        Microsoft Visual Studio VS7 registry key.

        Return
        ------
        str
            Registry key
        ZVS7r:   r   r   r   r   Úvs×   s    
zRegistryInfo.vsc                 C  s   dS )zƒ
        Microsoft Visual C++ for Python registry key.

        Return
        ------
        str
            Registry key
        zDevDiv\VCForPythonr   r   r   r   r   Úvc_for_pythonã   s    
zRegistryInfo.vc_for_pythonc                 C  s   dS )zq
        Microsoft SDK registry key.

        Return
        ------
        str
            Registry key
        zMicrosoft SDKsr   r   r   r   r   Úmicrosoft_sdkï   s    
zRegistryInfo.microsoft_sdkc                 C  s   t j | jd¡S )z‚
        Microsoft Windows/Platform SDK registry key.

        Return
        ------
        str
            Registry key
        r   ©r6   r7   r8   r>   r   r   r   r   Úwindows_sdkû   s    
zRegistryInfo.windows_sdkc                 C  s   t j | jd¡S )z€
        Microsoft .NET Framework SDK registry key.

        Return
        ------
        str
            Registry key
        ZNETFXSDKr?   r   r   r   r   Ú	netfx_sdk  s    
zRegistryInfo.netfx_sdkc                 C  s   dS )z€
        Microsoft Windows Kits Roots registry key.

        Return
        ------
        str
            Registry key
        zWindows Kits\Installed Rootsr   r   r   r   r   Úwindows_kits_roots  s    
zRegistryInfo.windows_kits_rootsFc                 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: str
            Force x86 software registry.

        Return
        ------
        str
            Registry key
        r   ZWow6432NodeZSoftwareÚ	Microsoft)r4   r$   r6   r7   r8   )r   Úkeyr   Znode64r   r   r   Ú	microsoft  s    zRegistryInfo.microsoftc           	      C  sà   t j}t j}t j}| j}| jD ]¼}d}z||||ƒd|ƒ}W nX tk
r”   | j ¡ sŒz||||dƒd|ƒ}W q� tk
rˆ   Y Y qY q�X nY qY nX z4zt  	||¡d W W ¢  S  tk
rÆ   Y nX W 5 |rØ||ƒ X q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ÚOpenKeyZCloseKeyrE   ÚHKEYSÚOSErrorr4   r$   ÚQueryValueEx)	r   rD   ÚnameZkey_readZopenkeyZclosekeyÚmsÚhkeyÚbkeyr   r   r   Úlookup2  s,    



zRegistryInfo.lookupN)F)r   r	   r
   r/   r   r   r   r   r   rH   r   r1   r5   r9   r;   r<   r=   r>   r@   rA   rB   rE   rO   r   r   r   r   r2   Ÿ   s6   
ü









r2   c                   @  s<  e Zd ZdZe dd¡Ze dd¡Ze de¡Zd7dd„Z	d	d
„ Z
dd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZdd„ 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,„ ƒZed-d.„ ƒZed/d0„ ƒZed1d2„ ƒZ d3d4„ Z!ed8d5d6„ƒZ"dS )9Ú
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)Nc                 C  s2   || _ | j j| _|  ¡ | _|p$|  ¡  | _| _d S r3   )Úrir4   Úfind_programdata_vs_versÚknown_vs_pathsÚ_find_latest_available_vs_verÚvs_verÚvc_ver)r   Zregistry_inforX   r   r   r   r   n  s    

zSystemInfo.__init__c                 C  s>   |   ¡ }|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_versrU   Ú	distutilsÚerrorsÚDistutilsPlatformErrorÚsetÚupdateÚsorted)r   Zreg_vc_versZvc_versr   r   r   rV   w  s    	
ÿz(SystemInfo._find_latest_available_vs_verc                 C  s*  | j j}| j j| j j| j jf}g }t | j j|¡D ]î\}}zt 	|||ƒdtj
¡}W n tk
rl   Y q2Y nX |�¨ t |¡\}}}	t|ƒD ]@}
t t¡�, tt ||
¡d ƒ}||krÂ| |¡ W 5 Q R X qŒt|ƒD ]>}
t t¡�* tt ||
¡ƒ}||k�r
| |¡ W 5 Q R X qÖW 5 Q R X q2t|ƒS )z˜
        Find Microsoft Visual Studio versions available in registry.

        Return
        ------
        list of float
            Versions
        r   )rS   rE   r;   r=   r<   Ú	itertoolsÚproductrH   r   rG   rF   rI   ZQueryInfoKeyÚrangeÚ
contextlibÚsuppressÚ
ValueErrorÚfloatZ	EnumValueÚappendÚEnumKeyr`   )r   rL   ZvckeysZvs_versrM   rD   rN   ZsubkeysÚvaluesr   ÚiÚverr   r   r   rZ   ‹  s*    	

"zSystemInfo.find_reg_vs_versc           	   
   C  sÂ   i }d}zt  |¡}W n tk
r.   | Y S X |D ]ˆ}zft j ||d¡}t|ddd��}t |¡}W 5 Q R X |d }t  t j |d¡¡ |||  |d ¡< W q4 tt	fk
rº   Y q4Y q4X q4|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)ÚencodingZinstallationPathúVC\Tools\MSVCZinstallationVersion)
r6   ÚlistdirrI   r7   r8   ÚopenÚjsonÚloadÚ_as_float_versionÚKeyError)	r   Zvs_versionsZinstances_dirZhashed_namesrK   Z
state_pathZ
state_fileÚstateZvs_pathr   r   r   rT   ª  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é   )rg   r8   Úsplit)Úversionr   r   r   rt   Ô  s    zSystemInfo._as_float_versionc                 C  s2   t j | jd| j ¡}| j | jjd| j ¡p0|S )zp
        Microsoft Visual Studio directory.

        Return
        ------
        str
            path
        zMicrosoft Visual Studio %0.1fú%0.1f)r6   r7   r8   ÚProgramFilesx86rW   rS   rO   r<   )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_legacyr6   r7   Úisdirr[   r\   r]   )r   r7   Úmsgr   r   r   ÚVCInstallDir÷  s
    
zSystemInfo.VCInstallDirc              	   C  s’   | j dkrdS z| j| j  }W n tk
r8   | j}Y nX tj |d¡}z*t |¡d }|  |¡| _	tj ||¡W S  t
tfk
rŒ   Y dS X dS )zl
        Locate Visual C++ for VS2017+.

        Return
        ------
        str
            path
        ç      ,@r   ro   rY   N)rW   rU   ru   r~   r6   r7   r8   rp   rt   rX   rI   Ú
IndexError)r   Zvs_dirZguess_vcrX   r   r   r   r   	  s    	
zSystemInfo._guess_vcc                 C  sn   t j | jd| j ¡}t j | jjd| j ¡}| j |d¡}|rNt j |d¡n|}| j | jjd| j ¡pl|S )z{
        Locate Visual C++ for versions prior to 2017.

        Return
        ------
        str
            path
        z Microsoft Visual Studio %0.1f\VCr{   Ú
installdirZVC)	r6   r7   r8   r|   rW   rS   r=   rO   r;   )r   r}   Zreg_pathZ	python_vcZ
default_vcr   r   r   r€   '  s    	 ÿzSystemInfo._guess_vc_legacyc                 C  sJ   | j dkrdS | j dkrdS | j dkr*dS | j dkr8dS | j d	krFd
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‹   N©rW   r   r   r   r   ÚWindowsSdkVersion<  s    

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

        Return
        ------
        str
            version
        Úlib)Ú_use_last_dir_namer6   r7   r8   ÚWindowsSdkDirr   r   r   r   ÚWindowsSdkLastVersionR  s    
z SystemInfo.WindowsSdkLastVersionc                 C  s:  d}| j D ]0}tj | jjd| ¡}| j |d¡}|r
 q<q
|rLtj |¡s„tj | jjd| j	 ¡}| j |d¡}|r„tj |d¡}|r”tj |¡sÚ| j D ]>}|d| 
d¡… }d	| }tj | j|¡}tj |¡rš|}qš|rìtj |¡�s | j D ],}d
| }tj | j|¡}tj |¡rò|}qò|�s6tj | jd¡}|S )zn
        Microsoft Windows SDK directory.

        Return
        ------
        str
            path
        r   zv%sÚinstallationfolderr{   r†   ZWinSDKNrw   zMicrosoft SDKs\Windows Kits\%szMicrosoft SDKs\Windows\v%sZPlatformSDK)r�   r6   r7   r8   rS   r@   rO   r�   r=   rX   ÚrfindrR   rƒ   )r   Úsdkdirrl   Úlocr7   Úinstall_baseZintverÚdr   r   r   r�   ^  s6    



zSystemInfo.WindowsSdkDirc           	      C  sÔ   | j dkrd}d}n&d}| j dkr&dnd}| jjd|d�}d	|| d
d¡f }g }| j dkr‚| jD ]}|tj | jj	||¡g7 }qb| j
D ]"}|tj | jjd| |¡g7 }qˆ|D ]}| j |d¡}|r°|  S q°dS )zy
        Microsoft Windows SDK executable directory.

        Return
        ------
        str
            path
        r‰   é#   r   é(   rŠ   TF)r   r(   zWinSDK-NetFx%dTools%sr+   ú-r„   zv%sAr’   N)rW   r4   r)   r   ÚNetFxSdkVersionr6   r7   r8   rS   rA   r�   r@   rO   )	r   Znetfxverr   r(   ZfxZregpathsrl   r7   Zexecpathr   r   r   ÚWindowsSDKExecutablePath‰  s$    



 
z#SystemInfo.WindowsSDKExecutablePathc                 C  s*   t j | jjd| j ¡}| j |d¡p(dS )zl
        Microsoft Visual F# directory.

        Return
        ------
        str
            path
        z%0.1f\Setup\F#Z
productdirr   )r6   r7   r8   rS   r5   rW   rO   )r   r7   r   r   r   ÚFSharpInstallDir®  s    
zSystemInfo.FSharpInstallDirc                 C  sF   | j dkrdnd}|D ]*}| j | jjd| ¡}|r|p:d  S qdS )zt
        Microsoft Universal CRT SDK directory.

        Return
        ------
        str
            path
        r„   )Ú10Z81r   z
kitsroot%sr   N)rW   rS   rO   rB   )r   Úversrl   r”   r   r   r   ÚUniversalCRTSdkDir»  s    zSystemInfo.UniversalCRTSdkDirc                 C  s   |   tj | jd¡¡S )z€
        Microsoft Universal C Runtime SDK last version.

        Return
        ------
        str
            version
        rŽ   )r�   r6   r7   r8   r    r   r   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
 q8q
|S )zu
        Microsoft .NET Framework SDK directory.

        Return
        ------
        str
            path
        r   Zkitsinstallationfolder)r›   r6   r7   r8   rS   rA   rO   )r   r”   rl   r•   r   r   r   ÚNetFxSdkDirí  s    

zSystemInfo.NetFxSdkDirc                 C  s&   t j | jd¡}| j | jjd¡p$|S )zw
        Microsoft .NET Framework 32bit directory.

        Return
        ------
        str
            path
        zMicrosoft.NET\FrameworkZframeworkdir32©r6   r7   r8   rQ   rS   rO   r;   ©r   Zguess_fwr   r   r   ÚFrameworkDir32ÿ  s    zSystemInfo.FrameworkDir32c                 C  s&   t j | jd¡}| j | jjd¡p$|S )zw
        Microsoft .NET Framework 64bit directory.

        Return
        ------
        str
            path
        zMicrosoft.NET\Framework64Zframeworkdir64r£   r¤   r   r   r   ÚFrameworkDir64  s    zSystemInfo.FrameworkDir64c                 C  s
   |   d¡S )zƒ
        Microsoft .NET Framework 32bit versions.

        Return
        ------
        tuple of str
            versions
        é    ©Ú_find_dot_net_versionsr   r   r   r   ÚFrameworkVersion32  s    
zSystemInfo.FrameworkVersion32c                 C  s
   |   d¡S )zƒ
        Microsoft .NET Framework 64bit versions.

        Return
        ------
        tuple of str
            versions
        é@   r¨   r   r   r   r   ÚFrameworkVersion64+  s    
zSystemInfo.FrameworkVersion64c                 C  s”   | j  | j jd| ¡}t| d| ƒ}|p6|  |d¡p6d}| jdkrJ|dfS | jdkrt| ¡ dd	… d
krld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
        zframeworkver%dzFrameworkDir%dÚvr   rŠ   zv4.0rˆ   Nrx   Zv4z
v4.0.30319úv3.5r‡   )r®   ú
v2.0.50727g       @)zv3.0r¯   )rS   rO   r;   Úgetattrr�   rW   r   )r   ÚbitsZreg_verZdot_net_dirrl   r   r   r   r©   7  s    

 

z!SystemInfo._find_dot_net_versionsc                   s,   ‡ ‡fdd„t t ˆ ¡ƒ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  s2   | ]*}t j t j ˆ |¡¡r| ˆ¡r|V  qd S r3   )r6   r7   r�   r8   Ú
startswith)Ú.0Údir_name©r7   Úprefixr   r   Ú	<genexpr>f  s   
ýz0SystemInfo._use_last_dir_name.<locals>.<genexpr>Nr   )Úreversedr6   rp   Únext)r7   r¶   Zmatching_dirsr   rµ   r   r�   U  s    þzSystemInfo._use_last_dir_name)N)r   )#r   r	   r
   r/   r   r0   rQ   rR   r|   r   rV   rZ   rT   Ústaticmethodrt   r1   r~   rƒ   r   r€   r�   r‘   r�   rœ   r�   r    r¡   r›   r¢   r¥   r¦   rª   r¬   r©   r�   r   r   r   r   rP   \  sZ   
	*





*
$








rP   c                   @  sZ  e Zd ZdZd?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edd„ ƒ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d0d1„ ƒZed2d3„ ƒZed4d5„ ƒZed6d7œd8d9„ƒZd@d;d<„Zd=d>„ Z dS )AÚ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   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   r4   r2   rS   rP   ÚsirX   r[   r\   r]   )r   r   rX   Z
vc_min_verÚerrr   r   r   r   ‡  s    

zEnvironmentInfo.__init__c                 C  s   | j jS )zk
        Microsoft Visual Studio.

        Return
        ------
        float
            version
        )r¼   rW   r   r   r   r   rW   �  s    
zEnvironmentInfo.vs_verc                 C  s   | j jS )zp
        Microsoft Visual C++ version.

        Return
        ------
        float
            version
        )r¼   rX   r   r   r   r   rX   œ  s    
zEnvironmentInfo.vc_verc                   sV   ddg}ˆ j dkrDˆ 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©r(   r   z1Common7\IDE\CommonExtensions\Microsoft\TestWindowzTeam Tools\Performance ToolszTeam Tools\Performance Tools%sc                   s   g | ]}t j ˆ jj|¡‘qS r   ©r6   r7   r8   r¼   r~   ©r³   r7   r   r   r   Ú
<listcomp>º  s     z+EnvironmentInfo.VSTools.<locals>.<listcomp>)rW   r4   r)   )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©r6   r7   r8   r¼   rƒ   r   r   r   r   Ú
VCIncludes¼  s    þzEnvironmentInfo.VCIncludesc                   sb   ˆ j dkrˆ jjdd�}nˆ jjdd�}d| d| g}ˆ j dkrP|d| g7 }‡ fd	d
„|D ƒS )z“
        Microsoft Visual C++ & Microsoft Foundation Class Libraries.

        Return
        ------
        list of str
            paths
        ç      .@T©r   ©r(   úLib%szATLMFC\Lib%sr„   zLib\store%sc                   s   g | ]}t j ˆ jj|¡‘qS r   rÆ   rÀ   r   r   r   rÁ   Þ  s     z/EnvironmentInfo.VCLibraries.<locals>.<listcomp>)rW   r4   r*   )r   rÃ   rÂ   r   r   r   ÚVCLibrariesË  s    


zEnvironmentInfo.VCLibrariesc                 C  s"   | 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)rW   r6   r7   r8   r¼   rƒ   r   r   r   r   ÚVCStoreRefsà  s    

zEnvironmentInfo.VCStoreRefsc                 C  s  | j }tj |jd¡g}| jdkr&dnd}| j |¡}|rT|tj |jd| ¡g7 }| jdkrˆd| jjdd� }|tj |j|¡g7 }nŒ| jdkrþ| j 	¡ r d	n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 }n|tj |jd¡g7 }|S )zr
        Microsoft Visual C++ Tools.

        Return
        ------
        list of str
            paths
        Z
VCPackagesrˆ   TFúBin%sr„   rÊ   rÈ   zbin\HostX86%szbin\HostX64%srÉ   ÚBin)r¼   r6   r7   r8   rƒ   rW   r4   r.   r)   r$   r*   r#   r   )r   r¼   Útoolsr,   rÃ   r7   Zhost_dirr   r   r   ÚVCToolsî  s0    


ÿÿ ÿÿzEnvironmentInfo.VCToolsc                 C  st   | j dkr2| 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||f ¡gS dS )	zw
        Microsoft Windows SDK Libraries.

        Return
        ------
        list of str
            paths
        rˆ   Tr¾   rË   rÉ   rŽ   z%sum%sN)	rW   r4   r*   r6   r7   r8   r¼   r�   Ú_sdk_subdir)r   rÃ   rŽ   Z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 d	S )
zu
        Microsoft Windows SDK Include.

        Return
        ------
        list of str
            paths
        Úincluderˆ   Úglr„   r   z%ssharedz%sumz%swinrtN)r6   r7   r8   r¼   r�   rW   rÒ   )r   rÔ   Úsdkverr   r   r   Ú
OSIncludes,  s    


ýzEnvironmentInfo.OSIncludesc                 C  sº   t j | jjd¡}g }| jdkr*|| j7 }| jdkrH|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d| j ddd¡g7 }|S )z}
        Microsoft Windows SDK Libraries Paths.

        Return
        ------
        list of str
            paths
        Z
Referencesr‡   r‰   zCommonConfiguration\Neutralr„   ZUnionMetadataz'Windows.Foundation.UniversalApiContractz1.0.0.0z%Windows.Foundation.FoundationContractz,Windows.Networking.Connectivity.WwanContractZExtensionSDKszMicrosoft.VCLibsr{   ZCommonConfigurationZneutral)r6   r7   r8   r¼   r�   rW   rÓ   )r   ÚrefÚlibpathr   r   r   Ú	OSLibpathF  s8    




  ÿùøzEnvironmentInfo.OSLibpathc                 C  s   t |  ¡ ƒS )zs
        Microsoft Windows SDK Tools.

        Return
        ------
        list of str
            paths
        )ÚlistÚ
_sdk_toolsr   r   r   r   ÚSdkToolsn  s    
zEnvironmentInfo.SdkToolsc                 c  s  | j dk r0| j dkrdnd}tj | jj|¡V  | j ¡ sd| jjdd�}d| }tj | jj|¡V  | j dkr¬| j 	¡ r~d	}n| jjddd
�}d| }tj | jj|¡V  nJ| j dkrötj | jjd¡}| jjdd�}| jj
}tj |d||f ¡V  | jj�r
| jjV  dS )zˆ
        Microsoft Windows SDK Tools paths generator.

        Return
        ------
        generator of str
            paths
        rÈ   r‰   rÏ   zBin\x86TrÉ   rÎ   )rˆ   r‰   r   r¾   zBin\NETFX 4.0 Tools%sz%s%sN)rW   r6   r7   r8   r¼   r�   r4   r$   r)   r!   r‘   rœ   )r   Úbin_dirrÃ   r7   rÖ   r   r   r   rÜ   z  s(    	





zEnvironmentInfo._sdk_toolsc                 C  s   | j j}|rd| S dS )zu
        Microsoft Windows SDK version subdir.

        Return
        ------
        str
            subdir
        ú%s\r   )r¼   r‘   ©r   Úucrtverr   r   r   rÒ   �  s    
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)rW   r6   r7   r8   r¼   r�   r   r   r   r   ÚSdkSetupª  s    

zEnvironmentInfo.SdkSetupc                   s”   | j }| j‰ | jdkr0d}| ¡  o,| ¡  }n$| ¡ p>| ¡ }|jdkpR|jdk}g }|rt|‡ fdd„ˆ jD ƒ7 }|r�|‡ fdd„ˆ jD ƒ7 }|S )zv
        Microsoft .NET Framework Tools.

        Return
        ------
        list of str
            paths
        rˆ   Tr   c                   s   g | ]}t j ˆ j|¡‘qS r   )r6   r7   r8   r¥   ©r³   rl   ©r¼   r   r   rÁ   Ï  s    z+EnvironmentInfo.FxTools.<locals>.<listcomp>c                   s   g | ]}t j ˆ j|¡‘qS r   )r6   r7   r8   r¦   rä   rå   r   r   rÁ   Ó  s    )	r4   r¼   rW   r!   r$   r#   r   rª   r¬   )r   r4   Z	include32Z	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„   TrÉ   zlib\um%s)rW   r¼   r¢   r4   r*   r6   r7   r8   )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)rW   r¼   r¢   r6   r7   r8   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 r0| jj}| jjdd�}n| jj}d}d| j |f }tj ||¡g}| j dkrz|tj ||d¡g7 }|S )zn
        Microsoft Build Engine.

        Return
        ------
        list of str
            paths
        rŠ   rÈ   TrÊ   r   zMSBuild\%0.1f\bin%sZRoslyn)	rW   r¼   r|   r4   r)   r~   r6   r7   r8   )r   Ú	base_pathrÃ   r7   Úbuildr   r   r   ÚMSBuild  s    



zEnvironmentInfo.MSBuildc                 C  s"   | 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)rW   r6   r7   r8   r¼   r|   r   r   r   r   ÚHTMLHelpWorkshop  s    

z EnvironmentInfo.HTMLHelpWorkshopc                 C  sL   | j dk rg S | jjdd�}tj | jjd¡}| j}tj |d||f ¡gS )zƒ
        Microsoft Universal C Runtime SDK Libraries.

        Return
        ------
        list of str
            paths
        r„   TrÉ   rŽ   z%sucrt%s)	rW   r4   r*   r6   r7   r8   r¼   r    Ú_ucrt_subdir)r   rÃ   rŽ   rá   r   r   r   ÚUCRTLibraries.  s    

zEnvironmentInfo.UCRTLibrariesc                 C  s6   | j dk rg S tj | jjd¡}tj |d| j ¡gS )z�
        Microsoft Universal C Runtime SDK Include.

        Return
        ------
        list of str
            paths
        r„   rÔ   z%sucrt)rW   r6   r7   r8   r¼   r    rî   )r   rÔ   r   r   r   ÚUCRTIncludes@  s    

zEnvironmentInfo.UCRTIncludesc                 C  s   | j j}|rd| S dS )z�
        Microsoft Universal C Runtime SDK version subdir.

        Return
        ------
        str
            subdir
        rß   r   )r¼   r¡   rà   r   r   r   rî   P  s    
zEnvironmentInfo._ucrt_subdirc                 C  s(   d| j   krdkrn ng S | jjgS )zk
        Microsoft Visual F#.

        Return
        ------
        list of str
            paths
        r‰   rŠ   )rW   r¼   r�   r   r   r   r   ÚFSharp]  s    
zEnvironmentInfo.FSharpz
str | None)Úreturnc                   sÜ   d| j  ‰| jjdd� d¡‰ g }| jj}tj | 	dd¡¡}tj 
|¡rxtj |t |¡d ¡}||tj |d¡g7 }|tj |d	¡g7 }d
| j d  d
t| jƒ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.
        zvcruntime%d0.dllTrÉ   r+   z\Toolsz\RedistrY   ZonecoreZredistzMicrosoft.VC%d.CRTé
   c                 3  s$   | ]\}}t j |ˆ |ˆ¡V  qd S r3   )r6   r7   r8   )r³   r¶   Zcrt_dir©rÃ   Z	vcruntimer   r   r·   ‰  s   ÿz2EnvironmentInfo.VCRuntimeRedist.<locals>.<genexpr>N)rX   r4   r*   Ústripr¼   rƒ   r6   r7   Údirnamer   r�   r8   rp   ÚintrW   ra   rb   r¹   ÚfilterÚisfile)r   ÚprefixesZ
tools_pathZredist_pathZcrt_dirsZcandidate_pathsr   rô   r   ÚVCRuntimeRedistl  s     
ý
þzEnvironmentInfo.VCRuntimeRedistTc                 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rª| jrª| j|d< |S )zÛ
        Return environment dict.

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

        Return
        ------
        dict
            environment
        rÔ   rŽ   rÙ   r7   )rÔ   rŽ   rÙ   r7   é   Zpy_vcruntime_redist)ÚdictÚ_build_pathsrÇ   r×   rð   rè   rÌ   rÓ   ræ   rï   rç   rÍ   rÚ   rÑ   rÄ   ré   rÝ   rã   rì   rí   rñ   rW   rû   )r   ÚexistsÚenvr   r   r   Ú
return_env�  sV    üø
û÷ý÷óå+
zEnvironmentInfo.return_envc           
      C  sv   t j |¡}t |d¡ tj¡}t  ||¡}|rBtt	tj
j|ƒƒn|}|sbd| ¡  }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 %s environment variable is empty)ra   ÚchainÚfrom_iterabler   r0   ry   r6   ÚpathseprÛ   rø   r7   r�   Úupperr[   r\   r]   r   r8   )
r   rK   Zspec_path_listsrÿ   Z
spec_pathsZ	env_pathsrÂ   Zextant_pathsr‚   Zunique_pathsr   r   r   rþ   Ì  s    zEnvironmentInfo._build_paths)Nr   )T)!r   r	   r
   r/   r   r1   rW   rX   rÄ   rÇ   rÌ   rÍ   rÑ   rÓ   r×   rÚ   rÝ   rÜ   rÒ   rã   ræ   rç   rè   ré   rì   rí   rï   rð   rî   rñ   rû   r  rþ   r   r   r   r   r»   o  sj   
	






)


'
#











"
=r»   )r/   Ú
__future__r   rd   ra   rr   r6   Úos.pathÚplatformÚtypingr   Zmore_itertoolsr   Údistutils.errorsr[   Úsystemr   r   rý   Ú__annotations__r   r2   rP   r»   r   r   r   r   Ú<module>   s0   y >    