a c@sVdZddlZddlmZddlmZmZddlmZm Z m Z m Z ddl Z ddl Z ddlZddlZddlmZddlmZdd lmZe d krdd lmZdd lmZnGd ddZeZeejjfZzddlm Z WneyYn0ddZ!d$ddZ"ddZ#ddZ$d%ddZ%GdddZ&GdddZ'Gd d!d!Z(Gd"d#d#Z)dS)&a Improved support for Microsoft Visual C++ compilers. Known supported compilers: -------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Microsoft Windows SDK 6.1 (x86, x64, ia64) Microsoft Windows SDK 7.0 (x86, x64, ia64) Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) Microsoft Visual C++ 14.X: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2019 (x86, x64, arm, arm64) This may also support compilers shipped with compatible Visual Studio versions. N)open)listdirpathsep)joinisfileisdirdirname) LegacyVersion) filterfalse) get_unpatchedWindows)winreg)environc@seZdZdZdZdZdZdS)rN)__name__ __module__ __qualname__ HKEY_USERSHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_CLASSES_ROOTrr\/workspaces/shunt/resources/test-fastapi/venv/lib/python3.9/site-packages/setuptools/msvc.pyr*sr)Regc Csd}|d|f}zt|d}WnFtyfz|d|f}t|d}Wnty`d}Yn0Yn0|rt|d}t|r|Stt|S)a Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone compiler build for Python (VCForPython / Microsoft Visual C++ Compiler for Python 2.7). Fall back to original behavior when the standalone compiler is not available. Redirect the path of "vcvarsall.bat". Parameters ---------- version: float Required Microsoft Visual C++ version. Return ------ str vcvarsall.bat path z-Software\%sMicrosoft\DevDiv\VCForPython\%0.1f installdirz Wow6432Node\Nz vcvarsall.bat)r get_valueKeyErrorrrr msvc9_find_vcvarsall)versionZvc_basekey productdir vcvarsallrrrrAs     rx86c Osz"tt}|||g|Ri|WStjjy8YntyHYn0zt||WStjjy}zt|||WYd}~n d}~00dS)ao Patched "distutils.msvc9compiler.query_vcvarsall" for support extra Microsoft Visual C++ 9.0 and 10.0 compilers. Set environment without use of "vcvarsall.bat". Parameters ---------- ver: float Required Microsoft Visual C++ version. arch: str Target architecture. Return ------ dict environment N) r msvc9_query_vcvarsall distutilserrorsDistutilsPlatformError ValueErrorEnvironmentInfo return_env_augment_exception)verarchargskwargsorigexcrrrr$ks  r$c Csrztt|WStjjy$Yn0zt|ddWStjjyl}zt|dWYd}~n d}~00dS)a* Patched "distutils._msvccompiler._get_vc_env" for support extra Microsoft Visual C++ 14.X compilers. Set environment without use of "vcvarsall.bat". Parameters ---------- plat_spec: str Target architecture. Return ------ dict environment ,@) vc_min_verN)r msvc14_get_vc_envr%r&r'r)r*r+)Z plat_specr1rrrr4s r4cOsJdtjvr8ddl}t|jtdkr8|jjj|i|Stt |i|S)z Patched "distutils._msvccompiler.gen_lib_options" for fix compatibility between "numpy.distutils" and "distutils._msvccompiler" (for Numpy < 1.11.2) znumpy.distutilsrNz1.11.2) sysmodulesnumpyr __version__r%Z ccompilerZgen_lib_optionsr msvc14_gen_lib_options)r.r/nprrrr9s  r9rcCs|jd}d|vs"d|vrd}|jfit}d}|dkrj|ddkr`|d 7}q|d 7}n.|d kr|d 7}||d 7}n|dkr|d7}|f|_dS)zl Add details to the exception message to help guide the user as to what action will resolve it. rr"zvisual cz0Microsoft Visual C++ {version:0.1f} is required.z-www.microsoft.com/download/details.aspx?id=%d"@Zia64z( Get it with "Microsoft Windows SDK 7.0"z% Get it from http://aka.ms/vcpython27$@z* Get it with "Microsoft Windows SDK 7.1": iW r2z[ Get it with "Build Tools for Visual Studio": https://visualstudio.microsoft.com/downloads/N)r.lowerformatlocalsfind)r1rr-messagetmplZ msdownloadrrrr+s   r+c@sbeZdZdZeddZddZe ddZ dd Z d d Z dd dZ dddZdddZdS) PlatformInfoz Current and Target Architectures information. Parameters ---------- arch: str Target architecture. Zprocessor_architecturercCs|dd|_dS)Nx64amd64)r>replacer-)selfr-rrr__init__szPlatformInfo.__init__cCs|j|jdddS)zs Return Target CPU architecture. Return ------ str Target CPU _r N)r-rArHrrr target_cpus zPlatformInfo.target_cpucCs |jdkS)z Return True if target CPU is x86 32 bits.. Return ------ bool CPU is x86 32 bits r#rLrKrrr target_is_x86s zPlatformInfo.target_is_x86cCs |jdkS)z Return True if current CPU is x86 32 bits.. Return ------ bool CPU is x86 32 bits r# current_cpurKrrrcurrent_is_x86s zPlatformInfo.current_is_x86FcCs.|jdkr|rdS|jdkr$|r$dSd|jS)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#rrF\x64\%srOrHhidex86rErrr current_dirszPlatformInfo.current_dircCs.|jdkr|rdS|jdkr$|r$dSd|jS)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#rrFrRrSrMrTrrr target_dir(szPlatformInfo.target_dircCs0|rdn|j}|j|krdS|dd|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_)rPrLrWrG)rHforcex86currentrrr cross_dir>szPlatformInfo.cross_dirN)FF)FF)F)rrr__doc__rgetr>rPrIpropertyrLrNrQrVrWr[rrrrrDs    rDc@seZdZdZejejejejfZ ddZ e ddZ e ddZ e dd Ze d d Ze d d Ze ddZe ddZe ddZe ddZdddZddZdS) RegistryInfoz Microsoft Visual Studio related registry information. Parameters ---------- platform_info: PlatformInfo "PlatformInfo" instance. cCs ||_dSN)pi)rHZ platform_inforrrrIcszRegistryInfo.__init__cCsdS)z Microsoft Visual Studio root registry key. Return ------ str Registry key Z VisualStudiorrKrrr visualstudiofs zRegistryInfo.visualstudiocCs t|jdS)z Microsoft Visual Studio SxS registry key. Return ------ str Registry key ZSxS)rrbrKrrrsxsrs zRegistryInfo.sxscCs t|jdS)z| Microsoft Visual C++ VC7 registry key. Return ------ str Registry key ZVC7rrcrKrrrvc~s zRegistryInfo.vccCs t|jdS)z Microsoft Visual Studio VS7 registry key. Return ------ str Registry key ZVS7rdrKrrrvss zRegistryInfo.vscCsdS)z Microsoft Visual C++ for Python registry key. Return ------ str Registry key zDevDiv\VCForPythonrrKrrr vc_for_pythons zRegistryInfo.vc_for_pythoncCsdS)zq Microsoft SDK registry key. Return ------ str Registry key zMicrosoft SDKsrrKrrr microsoft_sdks zRegistryInfo.microsoft_sdkcCs t|jdS)z Microsoft Windows/Platform SDK registry key. Return ------ str Registry key r rrhrKrrr windows_sdks zRegistryInfo.windows_sdkcCs t|jdS)z Microsoft .NET Framework SDK registry key. Return ------ str Registry key ZNETFXSDKrirKrrr netfx_sdks zRegistryInfo.netfx_sdkcCsdS)z Microsoft Windows Kits Roots registry key. Return ------ str Registry key zWindows Kits\Installed RootsrrKrrrwindows_kits_rootss zRegistryInfo.windows_kits_rootsFcCs$|js|rdnd}td|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 rZ Wow6432NodeZSoftware Microsoft)rarQr)rHr r#Znode64rrr microsoftszRegistryInfo.microsoftc Cstj}tj}|j}|jD]}z||||d|}Wn\ttfy|jsz||||dd|}WqttfyYYqYq0nYqYn0zt ||dWSttfyYq0qdS)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 rTN) rKEY_READOpenKeyrnHKEYSOSErrorIOErrorrarQ QueryValueEx)rHr nameZkey_readZopenkeymshkeybkeyrrrlookups"   zRegistryInfo.lookupN)F)rrrr\rrrrrrqrIr^rbrcrerfrgrhrjrkrlrnryrrrrr_Us6         r_c@s<eZdZdZeddZeddZedeZd7ddZ d d Z d d Z d dZ e ddZeddZeddZddZddZeddZeddZeddZedd Zed!d"Zed#d$Zed%d&Zed'd(Zed)d*Zed+d,Zed-d.Zed/d0Zed1d2Z d3d4Z!e d8d5d6Z"dS)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 ProgramFileszProgramFiles(x86)NcCs2||_|jj|_||_|p$||_|_dSr`)rirafind_programdata_vs_versknown_vs_paths_find_latest_available_vs_vervs_vervc_ver)rHZ registry_inforrrrrIs    zSystemInfo.__init__cCs>|}|s|jstjdt|}||jt|dS)zm Find the latest VC version Return ------ float version z%No Microsoft Visual C++ version foundr<)find_reg_vs_versrr%r&r'setupdatesorted)rHZ reg_vc_versZvc_versrrrr%s   z(SystemInfo._find_latest_available_vs_verc Cs|jj}|jj|jj|jjf}g}|jjD]}|D]}zt|||dtj}Wnt t fyjYq2Yn0t |\}}} t |D]B} z*t t|| d} | |vr|| WqtyYq0qt |D]@} z&t t|| } | |vr|| WqtyYq0qq2q*t|S)z Find Microsoft Visual Studio versions available in registry. Return ------ list of float Versions r)r}rnrergrfrqrrprorrrsZ QueryInfoKeyrangefloatZ EnumValueappendr(EnumKeyr) rHrvZvckeysZvs_versrwr rxZsubkeysvaluesrJir,rrrr8s2       zSystemInfo.find_reg_vs_versc Csi}d}z t|}Wnttfy.|YS0|D]}zpt||d}t|ddd}t|}Wdn1st0Y|d}tt|d||||d <Wq4tttfyYq4Yq40q4|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.jsonrtzutf-8)encodingNZinstallationPath VC\Tools\MSVCZinstallationVersion) rrrrsrrjsonload_as_float_versionr) rHZ vs_versionsZ instances_dirZ hashed_namesruZ state_pathZ state_filestateZvs_pathrrrr~[s*    ( z#SystemInfo.find_programdata_vs_verscCstd|dddS)z Return a string version as a simplified float version (major.minor) Parameters ---------- version: str Version. Return ------ float version .N)rrsplit)rrrrrszSystemInfo._as_float_versioncCs.t|jd|j}|j|jjd|jp,|S)zp Microsoft Visual Studio directory. Return ------ str path zMicrosoft Visual Studio %0.1f%0.1f)rProgramFilesx86rr}ryrf)rHdefaultrrr VSInstallDirs zSystemInfo.VSInstallDircCs,|p|}t|s(d}tj||S)zm Microsoft Visual C++ directory. Return ------ str path z(Microsoft Visual C++ directory not found) _guess_vc_guess_vc_legacyrr%r&r')rHpathmsgrrr VCInstallDirs  zSystemInfo.VCInstallDirc Cs|jdkrdSz|j|j}Wnty6|j}Yn0t|d}z$t|d}|||_t||WStt t fyYdS0dS)zl Locate Visual C++ for VS2017+. Return ------ str path r2rrr<N) rrrrrrrrrrrs IndexError)rHZvs_dirZguess_vcrrrrrs       zSystemInfo._guess_vccCsbt|jd|j}t|jjd|j}|j|d}|rBt|dn|}|j|jjd|jp`|S)z{ Locate Visual C++ for versions prior to 2017. Return ------ str path z Microsoft Visual Studio %0.1f\VCrrZVC)rrrr}rgryre)rHrZreg_pathZ python_vcZ default_vcrrrrs zSystemInfo._guess_vc_legacycCsJ|jdkrdS|jdkrdS|jdkr*dS|jdkr8dS|jd krFd Sd S) z Microsoft Windows SDK versions for specified MSVC++ version. Return ------ tuple of str versions r;)z7.0z6.1z6.0ar=)z7.1z7.0a&@)z8.0z8.0a(@)8.1z8.1ar2)z10.0rNrrKrrrWindowsSdkVersions     zSystemInfo.WindowsSdkVersioncCs|t|jdS)zt Microsoft Windows SDK last version. Return ------ str version lib)_use_last_dir_namer WindowsSdkDirrKrrrWindowsSdkLastVersions z SystemInfo.WindowsSdkLastVersioncCs d}|jD],}t|jjd|}|j|d}|r q8q |rDt|stt|jjd|j}|j|d}|rtt|d}|rt|s|jD]6}|d|d}d |}t|j |}t|r|}q|rt|s|jD]$}d |}t|j |}t|r|}q|st|j d }|S) zn Microsoft Windows SDK directory. Return ------ str path rzv%sinstallationfolderrrZWinSDKNrzMicrosoft SDKs\Windows Kits\%szMicrosoft SDKs\Windows\v%sZ PlatformSDK) rrr}rjryrrgrrfindr|r)rHsdkdirr,locr install_baseZintverdrrrr s6           zSystemInfo.WindowsSdkDirc Cs|jdkrd}d}n&d}|jdkr&dnd}|jjd|d}d ||d d f}g}|jd kr~|jD]}|t|jj||g7}qb|jD]}|t|jj d ||g7}q|D]}|j |d}|r|SqdS)zy Microsoft Windows SDK executable directory. Return ------ str path r#r(rTF)rErUzWinSDK-NetFx%dTools%srX-r2zv%sArN) rrarVrGNetFxSdkVersionrr}rkrrjry) rHZnetfxverr-rUZfxZregpathsr,rZexecpathrrrWindowsSDKExecutablePath7s"    z#SystemInfo.WindowsSDKExecutablePathcCs&t|jjd|j}|j|dp$dS)zl Microsoft Visual F# directory. Return ------ str path z%0.1f\Setup\F#r!r)rr}rbrry)rHrrrrFSharpInstallDirZs zSystemInfo.FSharpInstallDircCsF|jdkrdnd}|D]*}|j|jjd|}|r|p:dSqdS)zt Microsoft Universal CRT SDK directory. Return ------ str path r2)10Z81rz kitsroot%srN)rr}ryrl)rHversr,rrrrUniversalCRTSdkDirgs  zSystemInfo.UniversalCRTSdkDircCs|t|jdS)z Microsoft Universal C Runtime SDK last version. Return ------ str version r)rrrrKrrrUniversalCRTSdkLastVersion{s z%SystemInfo.UniversalCRTSdkLastVersioncCs|jdkrdSdS)z Microsoft .NET Framework SDK versions. Return ------ tuple of str versions r2) z4.7.2z4.7.1z4.7z4.6.2z4.6.1z4.6z4.5.2z4.5.1z4.5rrrKrrrrszSystemInfo.NetFxSdkVersioncCs8d}|jD](}t|jj|}|j|d}|r q4q |S)zu Microsoft .NET Framework SDK directory. Return ------ str path rZkitsinstallationfolder)rrr}rkry)rHrr,rrrr NetFxSdkDirs  zSystemInfo.NetFxSdkDircCs"t|jd}|j|jjdp |S)zw Microsoft .NET Framework 32bit directory. Return ------ str path zMicrosoft.NET\FrameworkZframeworkdir32rr{r}ryrerHZguess_fwrrrFrameworkDir32s zSystemInfo.FrameworkDir32cCs"t|jd}|j|jjdp |S)zw Microsoft .NET Framework 64bit directory. Return ------ str path zMicrosoft.NET\Framework64Zframeworkdir64rrrrrFrameworkDir64s zSystemInfo.FrameworkDir64cCs |dS)z Microsoft .NET Framework 32bit versions. Return ------ tuple of str versions _find_dot_net_versionsrKrrrFrameworkVersion32s zSystemInfo.FrameworkVersion32cCs |dS)z Microsoft .NET Framework 64bit versions. Return ------ tuple of str versions @rrKrrrFrameworkVersion64s zSystemInfo.FrameworkVersion64cCs|j|jjd|}t|d|}|p6||dp6d}|jdkrJ|dfS|jdkrt|dd d krld n|d fS|jd krdS|jdkrdSdS)z Find Microsoft .NET Framework versions. Parameters ---------- bits: int Platform number of bits: 32 or 64. Return ------ tuple of str versions zframeworkver%dzFrameworkDir%dvrrzv4.0r=NrZv4z v4.0.30319v3.5r;)r v2.0.50727g @)zv3.0r)r}ryregetattrrrr>)rHbitsZreg_verZ dot_net_dirr,rrrrs     z!SystemInfo._find_dot_net_versionscs*fddttD}t|dp(dS)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 c3s*|]"}tt|r|r|VqdSr`)rr startswith).0dir_namerprefixrr s z0SystemInfo._use_last_dir_name..Nr)reversedrnext)rrZ matching_dirsrrrrs  zSystemInfo._use_last_dir_name)N)r)#rrrr\rr]r{r|rrIrrr~ staticmethodrr^rrrrrrrrrrrrrrrrrrrrrrrrz sZ    #*      * "         rzc@sbeZdZdZd?ddZeddZedd Zed d Zed d Z eddZ eddZ eddZ eddZ eddZeddZeddZddZeddZed d!Zed"d#Zed$d%Zed&d'Zed(d)Zed*d+Zed,d-Zed.d/Zed0d1Zed2d3Zed4d5Zed6d7Zd@d9d:Zd;d<Z e!dAd=d>Z"dS)Br)aY 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. NrcCsBt||_t|j|_t|j||_|j|kr>d}tj |dS)Nz.No suitable Microsoft Visual C++ version found) rDrar_r}rzsirr%r&r')rHr-rr3errrrrrI0s    zEnvironmentInfo.__init__cCs|jjS)zk Microsoft Visual Studio. Return ------ float version )rrrKrrrr9s zEnvironmentInfo.vs_vercCs|jjS)zp Microsoft Visual C++ version. Return ------ float version )rrrKrrrrEs zEnvironmentInfo.vc_vercsVddg}jdkrDjjddd}|dg7}|dg7}|d|g7}fd d |DS) zu Microsoft Visual Studio Tools. Return ------ list of str paths z Common7\IDEz Common7\Toolsr2TrUrEz1Common7\IDE\CommonExtensions\Microsoft\TestWindowzTeam Tools\Performance ToolszTeam Tools\Performance Tools%scsg|]}tjj|qSrrrrrrrKrr cz+EnvironmentInfo.VSTools..)rrarV)rHpaths arch_subdirrrKrVSToolsQs    zEnvironmentInfo.VSToolscCst|jjdt|jjdgS)z Microsoft Visual C++ & Microsoft Foundation Class Includes. Return ------ list of str paths IncludezATLMFC\IncluderrrrKrrr VCIncludeses  zEnvironmentInfo.VCIncludescsbjdkrjjdd}njjdd}d|d|g}jdkrP|d|g7}fd d |DS) z Microsoft Visual C++ & Microsoft Foundation Class Libraries. Return ------ list of str paths .@TrErULib%sz ATLMFC\Lib%sr2z Lib\store%scsg|]}tjj|qSrrrrKrrrrz/EnvironmentInfo.VCLibraries..)rrarW)rHrrrrKr VCLibrariesrs  zEnvironmentInfo.VCLibrariescCs|jdkrgSt|jjdgS)z Microsoft Visual C++ store references Libraries. Return ------ list of str paths r2zLib\store\references)rrrrrKrrr VCStoreRefss zEnvironmentInfo.VCStoreRefscCs|j}t|jdg}|jdkr"dnd}|j|}|rL|t|jd|g7}|jdkr|d|jjdd}|t|j|g7}n|jdkr|jrd nd }|t|j||jjdd g7}|jj |jj kr|t|j||jjdd g7}n|t|jd g7}|S) zr Microsoft Visual C++ Tools. Return ------ list of str paths Z VCPackagesr=TFBin%sr2rrz bin\HostX86%sz bin\HostX64%srBin) rrrrrar[rVrQrWrPrL)rHrtoolsrYrrZhost_dirrrrVCToolss,     zEnvironmentInfo.VCToolscCsh|jdkr.|jjddd}t|jjd|gS|jjdd}t|jjd}|j}t|d||fgSdS) zw Microsoft Windows SDK Libraries. Return ------ list of str paths r=Trrrrz%sum%sN)rrarWrrr _sdk_subdir)rHrrZlibverrrr OSLibrariess zEnvironmentInfo.OSLibrariescCsht|jjd}|jdkr&|t|dgS|jdkr8|j}nd}t|d|t|d|t|d|gSd S) zu Microsoft Windows SDK Include. Return ------ list of str paths includer=glr2rz%ssharedz%sumz%swinrtN)rrrrr)rHrsdkverrrr OSIncludess      zEnvironmentInfo.OSIncludescCst|jjd}g}|jdkr&||j7}|jdkr@|t|dg7}|jdkr||t|jjdt|ddt|d dt|d dt|jjd d d |jdddg7}|S)z} Microsoft Windows SDK Libraries Paths. Return ------ list of str paths Z Referencesr;rzCommonConfiguration\Neutralr2Z UnionMetadataz'Windows.Foundation.UniversalApiContractz1.0.0.0z%Windows.Foundation.FoundationContractz,Windows.Networking.Connectivity.WwanContractZ ExtensionSDKszMicrosoft.VCLibsrZCommonConfigurationZneutral)rrrrr)rHreflibpathrrr OSLibpaths*           zEnvironmentInfo.OSLibpathcCs t|S)zs Microsoft Windows SDK Tools. Return ------ list of str paths )list _sdk_toolsrKrrrSdkToolss zEnvironmentInfo.SdkToolsccs|jdkr,|jdkrdnd}t|jj|V|js\|jjdd}d|}t|jj|V|jdvr|jrvd }n|jjddd }d |}t|jj|VnB|jdkrt|jjd}|jjdd}|jj}t|d ||fV|jj r|jj Vd S)z Microsoft Windows SDK Tools paths generator. Return ------ generator of str paths rrrzBin\x86Trr)r=rrrzBin\NETFX 4.0 Tools%sz%s%sN) rrrrrarQrVrNrr)rHbin_dirrrrrrrrs(     zEnvironmentInfo._sdk_toolscCs|jj}|rd|SdS)zu Microsoft Windows SDK version subdir. Return ------ str subdir %s\r)rrrHucrtverrrrr6s zEnvironmentInfo._sdk_subdircCs|jdkrgSt|jjdgS)zs Microsoft Windows SDK Setup. Return ------ list of str paths r;Setup)rrrrrKrrrSdkSetupCs zEnvironmentInfo.SdkSetupcs|j}|j|jdkr0d}| o,| }n$|p>|}|jdkpR|jdk}g}|rt|fddjD7}|r|fddjD7}|S)zv Microsoft .NET Framework Tools. Return ------ list of str paths r=TrFcsg|]}tj|qSr)rrrr,rrrrhsz+EnvironmentInfo.FxTools..csg|]}tj|qSr)rrrrrrrks) rarrrNrQrPrLrr)rHraZ include32Z include64rrrrFxToolsRs"    zEnvironmentInfo.FxToolscCs8|jdks|jjsgS|jjdd}t|jjd|gS)z~ Microsoft .Net Framework SDK Libraries. Return ------ list of str paths r2Trzlib\um%s)rrrrarWr)rHrrrrNetFxSDKLibrariesos z!EnvironmentInfo.NetFxSDKLibrariescCs&|jdks|jjsgSt|jjdgS)z} Microsoft .Net Framework SDK Includes. Return ------ list of str paths r2z include\um)rrrrrKrrrNetFxSDKIncludess z EnvironmentInfo.NetFxSDKIncludescCst|jjdgS)z Microsoft Visual Studio Team System Database. Return ------ list of str paths z VSTSDB\DeployrrKrrrVsTDbs zEnvironmentInfo.VsTDbcCsv|jdkrgS|jdkr0|jj}|jjdd}n |jj}d}d|j|f}t||g}|jdkrr|t||dg7}|S)zn Microsoft Build Engine. Return ------ list of str paths rrTrrzMSBuild\%0.1f\bin%sZRoslyn)rrrrarVrr)rH base_pathrrbuildrrrMSBuilds    zEnvironmentInfo.MSBuildcCs|jdkrgSt|jjdgS)zt Microsoft HTML Help Workshop. Return ------ list of str paths rzHTML Help Workshop)rrrrrKrrrHTMLHelpWorkshops z EnvironmentInfo.HTMLHelpWorkshopcCsD|jdkrgS|jjdd}t|jjd}|j}t|d||fgS)z Microsoft Universal C Runtime SDK Libraries. Return ------ list of str paths r2Trrz%sucrt%s)rrarWrrr _ucrt_subdir)rHrrrrrr UCRTLibrariess zEnvironmentInfo.UCRTLibrariescCs.|jdkrgSt|jjd}t|d|jgS)z Microsoft Universal C Runtime SDK Include. Return ------ list of str paths r2rz%sucrt)rrrrr)rHrrrr UCRTIncludess zEnvironmentInfo.UCRTIncludescCs|jj}|rd|SdS)z Microsoft Universal C Runtime SDK version subdir. Return ------ str subdir rr)rrrrrrrs zEnvironmentInfo._ucrt_subdircCs(d|jkrdkrnngS|jjgS)zk Microsoft Visual F#. Return ------ list of str paths rr)rrrrKrrrFSharps zEnvironmentInfo.FSharpc Csd|j}|jjddd}g}|jj}t|dd}t|rft |t |d}||t |dg7}|t |d g7}d |jd d t |j d f}t ||D]&\}}t ||||} t| r| Sqd S) z Microsoft Visual C++ runtime redistributable dll. Return ------ str path zvcruntime%d0.dllTrrXz\Toolsz\Redistr<ZonecoreZredistzMicrosoft.VC%d.CRT N)rrarWstriprrrrGrrrintr itertoolsproductr) rHZ vcruntimerprefixesZ tools_pathZ redist_pathZcrt_dirsrZcrt_dirrrrrVCRuntimeRedists  zEnvironmentInfo.VCRuntimeRedistTcCst|d|j|j|j|jg||d|j|j|j|j |j g||d|j|j|j |j g||d|j |j|j|j|j|j|j|j|jg |d}|jdkrt|jr|j|d<|S)z Return environment dict. Parameters ---------- exists: bool It True, only return existing paths. Return ------ dict environment rrrr)rrrrZpy_vcruntime_redist)dict _build_pathsrrrrrrrrrrrrrrrrrrr rrr)rHexistsenvrrrr*&sV   zEnvironmentInfo.return_envc Csptj|}t|dt}t||}|r A B C D _unique_everseen('ABBCcAD', str.lower) --> A B C D N)raddr __contains__)iterabler seenZseen_addelementkrrrrzs  z EnvironmentInfo._unique_everseen)Nr)T)N)#rrrr\rIr^rrrrrrrrrrrrrrrrrrrrrrrr rr*rrrrrrrr)sn        $    #             " 2"r))r#)r)*r\riorosrros.pathrrrrr5platformr distutils.errorsr%Z#setuptools.extern.packaging.versionr Zsetuptools.extern.six.movesr Zmonkeyr systemrrr ImportErrorr&r'Z_msvc9_suppress_errorsZdistutils.msvc9compilerrrr$r4r9r+rDr_rzr)rrrrsJ        * &  $s5