
    ~pi                    n   U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZ ddlmZ ddlmZ ddlmZ ddlZe
rdd	lmZmZ e
s ej0                         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!y)zo
Environment info about Microsoft Compilers.

>>> getfixture('windows_only')
>>> ei = EnvironmentInfo('amd64')
    )annotationsN)TYPE_CHECKING	TypedDictoverload)unique_everseen   )StrPath)py310)LiteralStringNotRequiredWindows)environc                      e Zd ZdZdZdZdZy)winregN)__name__
__module____qualname__
HKEY_USERSHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_CLASSES_ROOT     Q/opt/services/ai/voice_agent/venv/lib/python3.12/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      j                         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y)PlatformInfoz
    Current and Target Architectures information.

    Parameters
    ----------
    arch: str
        Target architecture.
    processor_architecture c                N    |j                         j                  dd      | _        y )Nx64amd64)lowerreplacearch)selfr$   s     r   __init__zPlatformInfo.__init__8   s    JJL((8	r   c                X    | j                   | j                   j                  d      dz   d S )zs
        Return Target CPU architecture.

        Return
        ------
        str
            Target CPU
        _r   N)r$   findr%   s    r   
target_cpuzPlatformInfo.target_cpu;   s(     yy,q0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_x86G   s     %''r   c                     | j                   dk(  S )z
        Return True if current CPU is x86 32 bits..

        Return
        ------
        bool
            CPU is x86 32 bits
        r-   current_cpur*   s    r   current_is_x86zPlatformInfo.current_is_x86R   s     5((r   c                l    | 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\r1   r%   hidex86r    s      r   current_dirzPlatformInfo.current_dir]   sR    $   E)g 	
   G+ 	

 d&&'(	
r   c                l    | 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!   r5   r6   r.   r7   s      r   
target_dirzPlatformInfo.target_diru   sL    $ 5(W 	
 7*s 	

 doo&'	
r   c                    |rdn| j                   }| j                  |k(  rdS | j                         j                  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(   )r2   r+   r;   r#   )r%   forcex86currents      r   	cross_dirzPlatformInfo.cross_dir   sQ      $%)9)9 ') 	
 "**42gYaA	
r   N)r$   strreturnNonerA   r@   )rA   bool)FFF)r   r   r   __doc__r   getr"   r2   r&   propertyr+   r/   r3   r9   r;   r?   r   r   r   r   r   ,   sW     '++6;AACK9 	4 	4	(	)
0
0
r   r   c                  P   e Zd ZdZej
                  ej                  ej                  ej                  fZ	ddZ
edd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd	       Zedd
       Zedd       Zeddd       Zeddd       ZdddZddZy)RegistryInfoz
    Microsoft Visual Studio related registry information.

    Parameters
    ----------
    platform_info: PlatformInfo
        "PlatformInfo" instance.
    c                    || _         y N)pi)r%   platform_infos     r   r&   zRegistryInfo.__init__   s	    r   c                     y)z
        Microsoft Visual Studio root registry key.

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

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

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

        Return
        ------
        str
            Registry key
        VS7rZ   r*   s    r   vszRegistryInfo.vs   r\   r   c                     y)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                     y)zq
        Microsoft SDK registry key.

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

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

        Return
        ------
        str
            Registry key
        NETFXSDKre   r*   s    r   	netfx_sdkzRegistryInfo.netfx_sdk  s     ww||D..
;;r   c                     y)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   c                     y rL   r   r%   keyr-   s      r   	microsoftzRegistryInfo.microsoft%  s    QTr   c                     y rL   r   rm   s      r   ro   zRegistryInfo.microsoft'  s    =@r   c                    | j                   j                         s|rdnd}t        j                  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)rM   r3   rT   rU   rV   )r%   rn   r-   node64s       r   ro   zRegistryInfo.microsoft)  s5      ww--/3Mww||JSAAr   c           	        t         j                  }t         j                  }t         j                  }| j                  }| j
                  D ]>  }d}	  || ||      d|      }	 t        j                  ||      d   |r ||       c S c S  y# t        $ rC | j                  j                         s$	  || ||d      d|      }n# t        $ r Y Y w xY wY Y vw xY w# t        $ r Y nw xY w	 |s ||       # |r	 ||       w w xY w)a%  
        Look for values in registry in Microsoft software registry.

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

        Return
        ------
        str | None
            value
        Nr   T)
r   KEY_READOpenKeyCloseKeyro   HKEYSOSErrorrM   r3   QueryValueEx)	r%   rn   namekey_readopenkeyclosekeymshkeybkeys	            r   lookupzRegistryInfo.lookup<  s     ??..??^^JJ 	#DD	tRWa:#**46q9 TN #	#&   ww--/!&tRT]AxH" ! ! 	   TN TN sZ   B!C#C/CC	CCCCC	C&#C6%C&&C66DN)rN   r   rA   rB   )rA   r   rE   )rn   r   r-   rD   rA   r   )rn   r@   r-   rD   rA   r@   )rn   r@   r}   r@   rA   
str | None)r   r   r   rF   r   r   r   r   r   rz   r&   rH   rQ   rW   r[   r_   ra   rc   rf   ri   rk   r   ro   r   r   r   r   rJ   rJ      s    	  !!  	E  	 	 	6 	6 	- 	- 	- 	- 	% 	% 	  	  	; 	; 	< 	< 	/ 	/ T T@ @B&'r   rJ   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!d	Zd"d
Zed        Zed#d       Zed#d       Zd Z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&d       Zed&d       Z d&dZ!ed'd(d       Z"y))
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                    || _         | j                   j                  | _        | j                         | _        |xs | j	                         x| _        | _        y rL   )rirM   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__x  sI      ''**";;= %+$Rd.P.P.RRdkr   c                    | j                         }|s+| j                  st        j                  j	                  d      t        |      }|j                  | j                         t        |      S )zm
        Find the latest VC version

        Return
        ------
        float
            version
        z%No Microsoft Visual C++ version found)find_reg_vs_versr   	distutilserrorsDistutilsPlatformErrorsetupdatemax)r%   reg_vc_versvc_verss      r   r   z(SystemInfo._find_latest_available_vs_ver  sa     ++-t22""997  k"t**+7|r   c           
        | j                   j                  }| j                   j                  | j                   j                  | j                   j                  f}g }t        j                  | j                   j                  |      D ]'  \  }}	 t        j                  | ||      dt        j                        }|5  t        j                  |      \  }}}	t        |      D ][  }
t        j                  t               5  t#        t        j$                  ||
      d         }||vr|j'                  |       ddd       ] t        |      D ]X  }
t        j                  t               5  t#        t        j(                  ||
            }||vr|j'                  |       ddd       Z 	 ddd       * t+        |      S # t        $ r Y Bw xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   hxY w)z
        Find Microsoft Visual Studio versions available in registry.

        Return
        ------
        list of float
            Versions
        r   N)r   ro   r[   ra   r_   	itertoolsproductrz   r   rx   rw   r{   QueryInfoKeyrange
contextlibsuppress
ValueErrorfloat	EnumValueappendEnumKeysorted)r%   r   vckeysvs_versr   rn   r   subkeysvaluesr(   ivers               r   r   zSystemInfo.find_reg_vs_vers  s    WW''**dgg33TWWZZ@"**477==&A 	0ID#~~dBsGQH  0%+%8%8%>"v 0A#,,Z8 0#F$4$4T1$=a$@Ag-#NN3/0 00
 w 0A#,,Z8 0#FNN4$;<g-#NN3/0 000 0	0" g  
0 0
0 00 0sO   ,F::AG";8G
	31G"$5G	
G":	GG
GG"GG""G,	c                   i }d}	 t        j                  |      }|D ]  }	 t         j                  j	                  ||d      }t        |dd      5 }t        j                  |      }ddd       d   }t        j                  t         j                  j	                  |d             ||| j                  |d	         <    |S # t        $ r |cY S w xY w# 1 sw Y   mxY w# t        t        f$ r Y w xY w)
z
        Find Visual studio 2017+ versions from information in
        "C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances".

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

277<<1ABC  D2259N3OPQ	( 1  		2 2 X& s;   C /CC&ACCCC	CC0/C0c                Z    t        dj                  | j                  d      dd             S )z
        Return a string version as a simplified float version (major.minor)

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

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

        Return
        ------
        str
            path
        Microsoft Visual Studio 0.1f)rT   rU   rV   ProgramFilesx86r   r   r   r_   )r%   defaults     r   VSInstallDirzSystemInfo.VSInstallDir  s]     '',,  $<T[[<N"O

 ww~~dggjjT[[,>@KGKr   c                    | j                         xs | j                         }t        j                  j	                  |      s!d}t
        j                  j                  |      |S )zm
        Microsoft Visual C++ directory.

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

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

        Return
        ------
        str
            path
        r   r   z\VC
installdirVC)	rT   rU   rV   r   r   r   ra   r   r[   )r%   r   reg_path	python_vc
default_vcs        r   r   zSystemInfo._guess_vc_legacy3  s     '',,  'D'9=
 77<< 5 5$++d9KMGGNN8\:	6?RWW\\)T2W
 ww~~dggjjT[[,>@NJNr   c                    | j                   dk  ry| j                   dk(  ry| j                   dk(  ry| j                   dk(  ry| j                   d	k\  ry
y)z
        Microsoft Windows SDK versions for specified MSVC++ version.

        Return
        ------
        tuple of str
            versions
              "@)z7.0z6.1z6.0a      $@)z7.1z7.0a      &@)z8.0z8.0a      (@)8.1z8.1ar   )z10.0r   r   r   r*   s    r   WindowsSdkVersionzSystemInfo.WindowsSdkVersionI  sR     ;;#'[[D  [[D  [[D  [[D  r   c                t    | j                  t        j                  j                  | j                  d            S )zt
        Microsoft Windows SDK last version.

        Return
        ------
        str
            version
        lib)_use_last_dir_namerT   rU   rV   WindowsSdkDirr*   s    r   WindowsSdkLastVersionz SystemInfo.WindowsSdkLastVersion_  s*     &&rww||D4F4F'NOOr   c                   d}| j                   D ]Y  }t        j                  j                  | j                  j
                  d|       }| j                  j                  |d      }|sY n |rt        j                  j                  |      s~t        j                  j                  | j                  j                  | j                  d      }| j                  j                  |d      }|r t        j                  j                  |d      }|rt        j                  j                  |      sv| j                   D ]g  }|d|j                  d       }d	| }t        j                  j                  | j                  |      }t        j                  j                  |      sf|}i |rt        j                  j                  |      sb| j                   D ]S  }d
| }t        j                  j                  | j                  |      }t        j                  j                  |      sR|}U |s*t        j                  j                  | j                  d      }|S )zn
        Microsoft Windows SDK directory.

        Return
        ------
        str
            path
        r   vinstallationfolderr   r   WinSDKNr   zMicrosoft SDKs\Windows Kits\zMicrosoft SDKs\Windows\vPlatformSDK)r   rT   rU   rV   r   rf   r   r   ra   r   rfindr   r   )r%   sdkdirr   locrU   install_baseintverds           r   r   zSystemInfo.WindowsSdkDirk  s     )) 	C'',,tww22auI>CWW^^C)=>F	 RWW]]6277<< 5 5$++d9KMD77>>$=LlH=RWW]]62-- -syy~.6vh?GGLL!2!2D977==#F RWW]]62-- 23%8GGLL!2!2D977==#F	
 WW\\$"3"3]CFr   c                d   | j                   dk  rd}d}nBd}| j                   dk  rdnd}| j                  j                  d|      j                  d	d
      }d| d| }g }| j                   dk\  rJ| j                  D ];  }|t
        j                  j                  | j                  j                  ||      gz  }= | j                  D ]?  }|t
        j                  j                  | j                  j                  d| d|      gz  }A |D ]$  }| j                  j                  |d      }|s"|c S  y)z
        Microsoft Windows SDK executable directory.

        Return
        ------
        str | None
            path
        r   #   r   (   r   TF)r    r8   r6   -zWinSDK-NetFxToolsr   r   Ar   N)r   rM   r9   r#   NetFxSdkVersionrT   rU   rV   r   ri   r   rf   r   )	r%   netfxverr$   r8   fxregpathsr   rU   execpaths	            r   WindowsSDKExecutablePathz#SystemInfo.WindowsSDKExecutablePath  s8    ;;$HDH"kkT1duG77&&4&AII$PSTDH:U4&1 ;;$++ GRWW\\$''*;*;S"EFFG )) 	LCdgg&9&9Qse1:rJKKH	L  	 Dww~~d,@AH	 
 r   c                    t         j                  j                  | j                  j                  | j
                  dd      }| j                  j                  |d      xs dS )zl
        Microsoft Visual F# directory.

        Return
        ------
        str
            path
        r   z	\Setup\F#
productdirr   )rT   rU   rV   r   rQ   r   r   )r%   rU   s     r   FSharpInstallDirzSystemInfo.FSharpInstallDir  sJ     ww||DGG00dkk$5Gy2QRww~~dL17R7r   c                    | j                   dk\  rdnd}|D ];  }| j                  j                  | j                  j                  d|       }|s9|c S  y)z{
        Microsoft Universal CRT SDK directory.

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

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

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

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

        Return
        ------
        str
            path
        zMicrosoft.NET\Framework64frameworkdir64r  r  s     r   FrameworkDir64zSystemInfo.FrameworkDir64   sB     77<<-IJ ww~~dggjj*:;GxGr   c                $    | j                  d      S )z
        Microsoft .NET Framework 32bit versions.

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

        Return
        ------
        tuple of str
            versions
        @   r!  r*   s    r   FrameworkVersion64zSystemInfo.FrameworkVersion64<  r$  r   c                |   | j                   j                  | j                   j                  d|       }t        | d|       }|xs | j	                  |d      xs d}| j
                  dk\  r|dfS | j
                  dk\  r|j                         dd	 d
k7  rddfS |dfS | j
                  dk(  ry| j
                  dk(  ryy)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   r[   getattrr   r   r"   )r%   bitsreg_verdot_net_dirr   s        r   r"  z!SystemInfo._find_dot_net_versionsH  s     ''..|D6-BCdl4&$9:H00cBHb ;;$;[[D #&99;r?d#:<VKKVKK[[C'[[C'r   c                n      fdt        t        j                               D        }t        |d      S )a-  
        Return name of the last dir in path or '' if no dir found.

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

        Return
        ------
        str
            name
        c              3     K   | ]T  }t         j                  j                  t         j                  j                  |            r|j	                        r| V y wrL   )rT   rU   r   rV   
startswith).0dir_namerU   prefixs     r   	<genexpr>z0SystemInfo._use_last_dir_name.<locals>.<genexpr>w  sF      
ww}}RWW\\$9:##F+ 
s   AAr   )reversedrT   r   next)rU   r7  matching_dirss   `` r   r   zSystemInfo._use_last_dir_namef  s/    "
$RZZ%56
 M2&&r   rL   )r   rJ   r   zfloat | NonerA   rB   )rA   zlist[float])rA   zdict[float, str]rC   )rA   ztuple[LiteralString, ...]rA   r   )rA   ztuple[str, ...])r   )rU   r	   r7  r@   rA   r@   )#r   r   r   rF   r   rG   r   r   r   r&   r   r   r   staticmethodr   rH   r   r   r   r   r   r   r   r  r  r  r  r   r  r  r  r#  r'  r"  r   r   r   r   r   r   f  s   	 W[[2&F7;;~r2L!gkk"5|DO CG	S)	S3?	S		S(>(T 7 7  L L"  "<O,  * 	P 	P ( (T " "H 
8 
8  (   
 
   " H H H H 	/ 	/ 	/ 	/< ' 'r   r   c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded<   y)	_EnvironmentDictr@   includer   libpathrU   zNotRequired[str | None]py_vcruntime_redistN)r   r   r   __annotations__r   r   r   r?  r?    s    L	HL
I00r   r?  c                     e Zd ZdZdd dZed        Zed        Zed        Zed        Z	ed        Z
ed	        Zed
        Zed        Zed        Zed        Zed        Zd Zed!d       Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed"d       Zed"d       Zed!d       Zed        Zed#d       Zd$d%dZd Z y)&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.
    Nc                    t        |      | _        t        | j                        | _        t	        | j                  |      | _        | j                  |k  r!d}t        j                  j                  |      y )Nz.No suitable Microsoft Visual C++ version found)
r   rM   rJ   r   r   sir   r   r   r   )r%   r$   r   
vc_min_vererrs        r   r&   zEnvironmentInfo.__init__  s]    t$tww'TWWf-;;#BC""99#>> $r   c                .    | j                   j                  S )zk
        Microsoft Visual Studio.

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

        Return
        ------
        float
            version
        )rG  r   r*   s    r   r   zEnvironmentInfo.vc_ver  rK  r   c                   ddg}| j                   dk\  r2| j                  j                  dd      }|dgz  }|dgz  }|d| gz  }|D cg c]6  }t        j                  j                  | j                  j                  |      8 c}S c c}w )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 Tools)r   rM   r9   rT   rU   rV   rG  r   )r%   pathsarch_subdirrU   s       r   VSToolszEnvironmentInfo.VSTools  s      !12;;$''--d-EKJKKE566E5k]CDDEEJKTTWW1148KKKs   
;Bc                    t         j                  j                  | j                  j                  d      t         j                  j                  | j                  j                  d      gS )z
        Microsoft Visual C++ & Microsoft Foundation Class Includes.

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

        Return
        ------
        list of str
            paths
              .@Tr    r8   Libz
ATLMFC\Libr   z	Lib\store)r   rM   r;   rT   rU   rV   rG  r   )r%   rP  rO  rU   s       r   VCLibrarieszEnvironmentInfo.VCLibraries  s     ;;$'',,,6K'',,T,:K{m$K=&AB;;$;-011EEJKTTWW1148KKKs   /;B-c                    | j                   dk  rg S t        j                  j                  | j                  j
                  d      gS )z
        Microsoft Visual C++ store references Libraries.

        Return
        ------
        list of str
            paths
        r   zLib\store\references)r   rT   rU   rV   rG  r   r*   s    r   VCStoreRefszEnvironmentInfo.VCStoreRefs  s8     ;;ITWW113JKLLr   c                   | j                   }t        j                  j                  |j                  d      g}| j
                  dk  rdnd}| j                  j                  |      }|r1|t        j                  j                  |j                  d|       gz  }| j
                  dk(  rOd| j                  j                  d       }|t        j                  j                  |j                  |      gz  }|S | j
                  dk\  r| j                  j                  j                  d	d
      j                         }t        j                  j                  dd| d      }|t        j                  j                  |j                  || j                  j                  d      z        gz  }| j                  j                  | j                  j                  k7  rK|t        j                  j                  |j                  || j                  j                  d      z        gz  }|S |t        j                  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   rX  rV  r!   r    binHostz%srW  )rG  rT   rU   rV   r   r   rM   r?   r9   r2   r#   upperr;   r+   )r%   rG  toolsr=   rP  rU   host_idhost_dirs           r   VCToolszEnvironmentInfo.VCTools  s   ( WWboo|<=;;$.4Egg''1bggll2??c+4GHIIE;;$,,T,:;<Dbggll2??D9::E& # [[D gg))11'5AGGIGww||ET'"+=>HR__h9K9KPT9K9U.UV E ww""dgg&8&88GGLLDGG4G4GD4G4Q)Q   bggll2??E:;;Er   c                   | j                   dk  rU| j                  j                  dd      }t        j                  j                  | j                  j                  d|       gS | j                  j                  d      }t        j                  j                  | j                  j                  d      }| j                  }t        j                  j                  || d|       gS )zw
        Microsoft Windows SDK Libraries.

        Return
        ------
        list of str
            paths
        r   TrN  rY  rW  r   um)	r   rM   r;   rT   rU   rV   rG  r   _sdk_subdir)r%   rP  r   libvers       r   OSLibrarieszEnvironmentInfo.OSLibraries:  s     ;;$'',,Tt,DKGGLL!6!6#k]8KLMM '',,,6K'',,tww44e<C%%FGGLL;-&@ABBr   c                   t         j                  j                  | j                  j                  d      }| j
                  dk  r"|t         j                  j                  |d      gS | j
                  dk\  r| j                  }nd}t         j                  j                  || d      t         j                  j                  || d      t         j                  j                  || d      gS )	zu
        Microsoft Windows SDK Include.

        Return
        ------
        list of str
            paths
        r@  r   glr   r   sharedrh  winrt)rT   rU   rV   rG  r   r   ri  )r%   r@  sdkvers      r   
OSIncludeszEnvironmentInfo.OSIncludesN  s     '',,tww44i@;;$RWW\\'4899 {{d"))W&78Wm4W&67 r   c                   t         j                  j                  | j                  j                  d      }g }| j
                  dk  r|| j                  z  }| j
                  dk\  r$|t         j                  j                  |d      gz  }| j
                  dk\  r||t         j                  j                  | j                  j                  d      t         j                  j                  |dd      t         j                  j                  |d	d      t         j                  j                  |d
d      t         j                  j                  | j                  j                  dd| j
                  dddd      gz  }|S )z}
        Microsoft Windows SDK Libraries Paths.

        Return
        ------
        list of str
            paths
        
Referencesr   r   zCommonConfiguration\Neutralr   UnionMetadataz'Windows.Foundation.UniversalApiContractz1.0.0.0z%Windows.Foundation.FoundationContractz,Windows.Networking.Connectivity.WwanContractExtensionSDKszMicrosoft.VCLibsr   CommonConfigurationneutral)rT   rU   rV   rG  r   r   rk  )r%   refrA  s      r   	OSLibpathzEnvironmentInfo.OSLibpathh  s)    ggll47700,?;;#t'''G;;$S*HIJJG;;$TWW22ODS"KYWS"I9UG GG))#&{{4( ) G$ r   c                4    t        | j                               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  rI| j                   dk  rdnd}t        j                  j                  | j                  j
                  |       | j                  j                         sW| j                  j                  d      }d| }t        j                  j                  | j                  j
                  |       | j                   dv rv| j                  j                         rd}n| j                  j                  dd	      }d
| }t        j                  j                  | j                  j
                  |       n| j                   dk\  rt        j                  j                  | j                  j
                  d      }| j                  j                  d      }| j                  j                  }t        j                  j                  || |        | j                  j                  r| j                  j                   yyw)z
        Microsoft Windows SDK Tools paths generator.

        Return
        ------
        generator of str
            paths
        rV  r   r_  zBin\x86TrW  )r   r   r   rN  zBin\NETFX 4.0 ToolsN)r   rT   rU   rV   rG  r   rM   r3   r9   r/   r   r  )r%   bin_dirrP  rU   rp  s        r   r|  zEnvironmentInfo._sdk_tools  s     ;;#{{d2e
G'',,tww44g>>ww%%'''--$-7K&D'',,tww44d;;;;,&ww$$& "gg11$D1I)+7D'',,tww44d;;[[D 77<< 5 5u=D''--$-7KWW22F'',,tx}%=>>77++''222 ,s   HHc                @    | j                   j                  }|r| dS dS )zu
        Microsoft Windows SDK version subdir.

        Return
        ------
        str
            subdir
        r6   r   )rG  r   r%   ucrtvers     r   ri  zEnvironmentInfo._sdk_subdir  s&     ''//#*7)222r   c                    | j                   dkD  rg S t        j                  j                  | j                  j
                  d      gS )zs
        Microsoft Windows SDK Setup.

        Return
        ------
        list of str
            paths
        r   Setup)r   rT   rU   rV   rG  r   r*   s    r   SdkSetupzEnvironmentInfo.SdkSetup  s7     ;;ITWW22G<==r   c                Z   | j                   }| j                  }| j                  dk  r'd}|j                          xr |j	                          }nB|j                         xs |j	                         }|j
                  dk(  xs |j                  dk(  }g }|rE||j                  D cg c],  }t        j                  j                  |j                  |      . c}z  }|rE||j                  D cg c],  }t        j                  j                  |j                  |      . c}z  }|S c c}w c c}w )zv
        Microsoft .NET Framework Tools.

        Return
        ------
        list of str
            paths
        r   Tr!   )rM   rG  r   r/   r3   r2   r+   r#  rT   rU   rV   r  r'  r  )r%   rM   rG  	include32	include64rc  r   s          r   FxToolszEnvironmentInfo.FxTools  s    WWWW;;$I,,..Jr7H7H7J3JI((*Ab.?.?.AI'1MR]]g5MI@B@U@U9<R..4 E @B@U@U9<R..4 E s   $1D#+1D(c                    | j                   dk  s| j                  j                  sg S | j                  j	                  d      }t
        j                  j                  | j                  j                  d|       gS )z~
        Microsoft .Net Framework SDK Libraries.

        Return
        ------
        list of str
            paths
        r   TrW  zlib\um)r   rG  r  rM   r;   rT   rU   rV   )r%   rP  s     r   NetFxSDKLibrariesz!EnvironmentInfo.NetFxSDKLibraries  sa     ;;TWW%8%8Igg((T(2TWW00VK=2IJKKr   c                    | j                   dk  s| j                  j                  sg S t        j                  j                  | j                  j                  d      gS )z}
        Microsoft .Net Framework SDK Includes.

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

        Return
        ------
        list of str
            paths
        zVSTSDB\Deploy)rT   rU   rV   rG  r   r*   s    r   VsTDbzEnvironmentInfo.VsTDb  s'     TWW113CDEEr   c                   | j                   dk  rg S | j                   dk  r3| j                  j                  }| j                  j	                  d      }n| j                  j
                  }d}d| j                   dd| }t        j                  j                  ||      g}| j                   dk\  r%|t        j                  j                  ||d	      gz  }|S )
zn
        Microsoft Build Engine.

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

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

        Return
        ------
        list of str
            paths
        r   TrW  r   r  Nucrt)r   rM   r;   rT   rU   rV   rG  r  r  r
   r  _ucrt_subdir)r%   rP  r   r  r  s        r   UCRTLibrarieszEnvironmentInfo.UCRTLibrariesP  s     ;;Igg((T(2	'',,tww995AC ##SWIT+"?@AA	  	NN2?@	s   4B 	B:B55B:c                :   | j                   dk  rg S 	 t        j                  j                  | j                  j
                  d      }t        j                  j                  || j                   d      gS # t        $ r}t        j                  |d        d}~ww xY w)z
        Microsoft Universal C Runtime SDK Include.

        Return
        ------
        list of str
            paths
        r   r@  r  Nr  )
r   rT   rU   rV   rG  r  r  r
   r  r  )r%   r@  r  s      r   UCRTIncludeszEnvironmentInfo.UCRTIncludesf  s     ;;I	ggll477#=#=yIG W):):(;4&@ABB  	NN2?@	s   4A5 5	B>BBc                @    | j                   j                  }|r| dS dS )z
        Microsoft Universal C Runtime SDK version subdir.

        Return
        ------
        str
            subdir
        r6   r   )rG  r  r  s     r   r  zEnvironmentInfo._ucrt_subdirz  s&     ''44#*7)222r   c                `    d| j                   cxkD  rdkD  rg S  | j                  j                  gS )zk
        Microsoft Visual F#.

        Return
        ------
        list of str
            paths
        r   r   )r   rG  r  r*   s    r   FSharpzEnvironmentInfo.FSharp  s4     $++$$I % (())r   c                @   d| j                    d| j                  j                  d      j                  d      g }| j                  j
                  }t        j                  j                  |j                  dd            }t        j                  j                  |      r[t        j                  j                  |t        j                  |      d         }||t        j                  j                  |d	      gz  }|t        j                  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.dllTrW  r6   z\Toolsz\Redistr   onecoreredistzMicrosoft.VC
   z.CRTc              3  h   K   | ])  \  }}t         j                  j                  ||       + y wrL   )rT   rU   rV   )r5  r7  crt_dirrP  r  s      r   r8  z2EnvironmentInfo.VCRuntimeRedist.<locals>.<genexpr>  s0      
! GGLLgyA
s   /2N)r   rM   r;   striprG  r   rT   rU   dirnamer#   r   rV   r   intr   r   r   r:  filterisfile)r%   prefixes
tools_pathredist_pathcrt_dirscandidate_pathsrP  r  s         @@r   VCRuntimeRedistzEnvironmentInfo.VCRuntimeRedist  sN     }E2	gg((T(288> WW))
ggooj&8&8J&OP77==%'',,{BJJ{4KB4OPKbggll;	&JKKHRWW\\*h788 4;;+,D13t{{+b016

%.%6%6x%J
 F277>>?;TBBr   c                   t        | j                  d| j                  | j                  | j                  | j
                  g|      | j                  d| j                  | j                  | j                  | j                  | j                  g|      | j                  d| j                  | j                  | j                  | j                  g|      | j                  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
        r@  r   rA  rU   )r@  r   rA  rU      rB  )r?  _build_pathsrT  rq  r  r  rZ  rk  r  r  r  r\  ry  rf  rQ  r  r}  r  r  r  r  r   r  )r%   existsenvs      r   
return_envzEnvironmentInfo.return_env  sR    %%OOOO%%))	 	 !!$$$$LL&&** 
 %%!!4<<1A1A4>>R
 ""LLLLJJMMMMLLLL))KK
 7*
V ;;"!5!5)-)=)=C%&
r   c                   t         j                  j                  |      }t        j                  |d      j                  t        j                        }t        j                  ||      }|r-t        t        t        j                  j                  |            n|}|s2|j                          d}t        j                  j                  |      t!        |      }	t        j                  j#                  |	      S )aC  
        Given an environment variable name and specified paths,
        return a pathsep-separated string of paths containing
        unique, extant, directories from those paths and from
        the environment variable. Raise an error if no paths
        are resolved.

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

        Return
        ------
        str
            Pathsep-separated paths
        r   z environment variable is empty)r   chainfrom_iterabler   rG   r   rT   pathsepr{  r  rU   r   rb  r   r   r   r   rV   )
r%   r}   spec_path_listsr  
spec_paths	env_pathsrO  extant_pathsr   unique_pathss
             r   r  zEnvironmentInfo._build_paths  s    . __22?C
KKb)//

;	
I6=CtF277==%89ZZ\N"@AC""99#>>&|4zz|,,r   )Nr   )rA   rB   rC   )rA   z	list[str]r<  )T)r  rD   rA   r?  )!r   r   r   rF   r&   rH   r   r   rQ  rT  rZ  r\  rf  rk  rq  ry  r}  r|  ri  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   rE  rE    s   .? 	 	 	 	 L L& 
 
 L L( M M 0 0d C C&  2 % %N 	' 	'!3F 
3 
3 > >  < L L B B 	F 	F  6 M M B B* C C& 
3 
3 * *  C  CD;z-r   rE  )"rF   
__future__r   r   r   r   rT   os.pathplatformtypingr   r   r   more_itertoolsr   _pathr	   compatr
   distutils.errorsr   typing_extensionsr   r   systemr   r   dictrC  r   rJ   r   r?  rE  r   r   r   <module>r     s    #    	   5 5 *   < *i7! ! #fG^$v
 v
r~ ~BW' W't1y 1M
- M
-r   