a h @ s d Z ddlZddlmZ ddlmZmZ ddlmZm Z m Z mZ ddlZddl Z ddlZddlZddlZddlZddlmZ ddlmZ e d krddlZdd lmZ nG dd dZe ZeejjfZzdd lm Z W n ey Y n0 dd Z!d.ddZ"dd Z#dd Z$dddddZ%dd Z&dd Z'dd Z(d!d" Z)d/d$d%Z*G d&d' d'Z+G d(d) d)Z,G d*d+ d+Z-G d,d- d-Z.dS )0a 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 ) get_unpatchedWindows)environc @ s e Zd ZdZdZdZdZdS )winregN)__name__ __module____qualname__ HKEY_USERSHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_CLASSES_ROOT r r 3/usr/lib/python3.9/site-packages/setuptools/msvc.pyr * s r )Regc C s d}|d| f }zt |d}W nF tyf z|d| f }t |d}W n ty` d}Y n0 Y n0 |rt|d}t|r|S tt| 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 installdirzWow6432Node\N vcvarsall.bat)r Z get_valueKeyErrorr r r msvc9_find_vcvarsall)versionZvc_basekey productdir vcvarsallr r r r A s r x86c O s z"t t}|| |g|R i |W S tjjy8 Y n tyH Y n0 zt|| W S tjjy } zt|| | W Y d}~n d}~0 0 dS )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)verarchargskwargsZorigexcr r r r# k s r# c C s zt t jddt jt jB } W n ty2 Y dS 0 d}d}| t D ]}zt | |\}}}W n ty| Y qY n0 |rJ|t j krJt |rJztt|}W n t tfy Y qJY n0 |dkrJ||krJ|| }}qJW d n1 s0 Y ||fS )0Python 3.8 "distutils/_msvccompiler.py" backportz'Software\Microsoft\VisualStudio\SxS\VC7r NNN )r OpenKeyr KEY_READZKEY_WOW64_32KEYOSError itertoolscount EnumValueZREG_SZr intfloatr' TypeError)r best_versionbest_dirivZvc_dirZvtr r r r _msvc14_find_vc2015 s2 *r@ c C s t dpt d} | sdS z8tt| dddddd d ddd dg jddd }W n tjtt fyp Y dS 0 t|ddd}t |rd|fS dS )a Python 3.8 "distutils/_msvccompiler.py" backport Returns "15, path" based on the result of invoking vswhere.exe If no install is found, returns "None, None" The version is returned to avoid unnecessarily changing the function result. It may be ignored when the path is not None. If vswhere.exe is not available, by definition, VS 2017 is not installed. ProgramFiles(x86)ProgramFilesr1 zMicrosoft Visual StudioZ Installerzvswhere.exez-latestz-prereleasez -requiresz1Microsoft.VisualStudio.Component.VC.Tools.x86.x64z -propertyinstallationPathz -products*mbcsstrict)encodingr% VCZ AuxiliaryZBuild )r get subprocesscheck_outputr decodestripCalledProcessErrorr5 UnicodeDecodeErrorr )rootpathr r r _msvc14_find_vc2017 s( rS x64ZarmZarm64)r" Z x86_amd64Zx86_armZ x86_arm64c C s t \}}d}| tv r t| }nd| v r,dnd}|rt|ddddd|d d }zddl}|j|dd d }W n tttfy d}Y n0 |st \}}|rt|d|dd }|sdS t|d}t|sdS |rt|sd}||fS )r0 Namd64rT r" z..redistZMSVCz**zMicrosoft.VC14*.CRTzvcruntime140.dllr T) recursivezMicrosoft.VC140.CRTr1 r ) rS PLAT_SPEC_TO_RUNTIMEr globImportErrorr5 LookupErrorr@ r ) plat_spec_r= vcruntimeZvcruntime_platZvcredistrZ r<