3 \KT�@s�ddlZddlZddlZddlZddlZddlmZmZmZm Z m Z ddl m Z m Z ddlmZddlmZddlmZdd�Zd d �Zd d �Zd d�Zddd�Zddd�Zedg�ZGdd�de �ZdS)�N)�DistutilsExecError�DistutilsPlatformError� CompileError�LibError� LinkError)� CCompiler�gen_lib_options)�log)� get_platform)�countc$Cs�ytjtjdtjtjBd�}Wntk r<tjd�dSXd}d}|��x�t�D]�}ytj ||�\}}}Wntk r�PYnX|rT|tj krTt j j |�rTytt|��}Wnttfk r�wTYnX|dkrT||krT||}}qTWWdQRX||fS)Nz'Software\Microsoft\VisualStudio\SxS\VC7)�accesszVisual C++ is not registeredr�)NN)�winregZ OpenKeyEx�HKEY_LOCAL_MACHINEZKEY_READZKEY_WOW64_32KEY�OSErrorr �debugr Z EnumValueZREG_SZ�os�path�isdir�int�float� ValueError� TypeError)�key� best_version�best_dir�i�v�vc_dirZvt�version�r �//usr/lib64/python3.6/distutils/_msvccompiler.py� _find_vc2015s0  r"c s�ddl�ddl}d }d}g���fdd�}|j|d�}|j�|j�x��D]~\}}}}d|krLtjj|ddd�} tjj| �s�qLytd d �|j d �D��} Wnt t fk r�wLYnX| |krL| | }}qLWy |d}Wnt k r�d}YnX||fS) Nrcs�j�j��dS)N)�extend�findallr )�_distutils_findvs� all_packagesr r!�_getallDsz_find_vc2017.._getall)�targetz1Microsoft.VisualStudio.Component.VC.Tools.x86.x64ZVCZ AuxiliaryZBuildcss|]}t|�VqdS)N)r)�.0rr r r!� Psz_find_vc2017..�.)r) r%� threadingZThread�start�joinrrr�tuple�splitrr� IndexError) r,rrr'�t�nameZ version_strrZpackagesrrr )r%r&r!� _find_vc2017:s2    r4cCs t�\}}d}d|krdnd}|rztjj|ddddddd �}yd dl}|j|d d �d}Wntttfk rxd}YnX|s�t�\}}|r�tjj|d|dd �}|s�t j d�dStjj|d�}tjj |�s�t j d|�dS| p�tjj |� �rt j d|�d}||fS)N�amd64Zx64�x86z..ZredistZMSVCz**zMicrosoft.VC141.CRTzvcruntime140.dllrT)� recursive�zMicrosoft.VC140.CRTz$No suitable Visual C++ version foundz vcvarsall.batz%s cannot be found�����)NN)NN) r4rrr.�glob� ImportErrorr� LookupErrorr"r r�isfile)� plat_specrr� vcruntimeZvcruntime_platZvcredistr:� vcvarsallr r r!�_find_vcvarsall[s6        rAcCs�tjd�rdd�tjj�D�St|�\}}|s6td��y&tjdj||�tj d�j ddd �}Wn@tj k r�}z"t j |j�td j|j���WYdd}~XnXd d�d d �|j�D�D�}|r�||d<|S)NZDISTUTILS_USE_SDKcSsi|]\}}||j��qSr )�lower)r)r�valuer r r!� sz_get_vc_env..zUnable to find vcvarsall.batzcmd /u /c "{}" {} && set)�stderrzutf-16le�replace)�errorszError executing {}cSs$i|]\}}}|r|r||j��qSr )rB)r)r�_rCr r r!rD�scss|]}|jd�VqdS)�=N)� partition)r)�liner r r!r*�sz_get_vc_env..�py_vcruntime_redist)r�getenv�environ�itemsrAr� subprocessZ check_output�formatZSTDOUT�decodeZCalledProcessErrorr �error�output�cmd� splitlines)r>r@r?�out�exc�envr r r!� _get_vc_env}s(     rZcCsN|stjd�jtj�}x2|D]*}tjjtjj|�|�}tjj|�r|SqW|S)Nr)rrMr0�pathseprr.�abspathr=)Zexe�paths�p�fnr r r!� _find_exe�s   r`r6Z x86_amd64)Zwin32z win-amd64zvcruntime140.dllc s�eZdZdZiZdgZdddgZdgZdgZeeeeZ dZ d Z d Z d Z d ZZd Zd)dd�Zd*dd�Zd+dd�Zd,dd�Zd-dd�Zd.dd�Zdd�Z�fdd �Zd!d"�Zd#d$�Zd%d&�Zd/d'd(�Z�ZS)0� MSVCCompilerZmsvcz.cz.ccz.cppz.cxxz.rcz.mcz.resz.objz.libz.dllz%s%sz.exercCs tj||||�d|_d|_dS)NF)r�__init__� plat_name� initialized)�self�verboseZdry_runZforcer r r!rb�szMSVCCompiler.__init__NcCs>|dkrt�}|tkr(tdjtt����t|}t|�}|sDtd��|jdd�|_|jjt j �}t d|�|_ t d|�|_ t d|�|_t d|�|_t d |�|_t d |�|_|jd d�|_x2|jd d�jt j �D]}|r�|j|jt j��q�Wx6|jd d�jt j �D]}|�r|j|jt j���qWd|_dddddg|_|jj|j�rJdnd�ddddddg|_dddg}|j�s~|jd$�ddddg}|d%�|_|d&�|_|d'�|_|d(�|_|�|_ |�|_!t"j#df|jt"j#d"f|jt"j#d#f|jt"j$df|jt"j$d"f|jt"j$d#f|jt"j%df|j t"j%d"f|j t"j%d#f|j!i |_&d#|_'dS))Nz--plat-name must be one of {}z7Unable to find a compatible Visual Studio installation.r�zcl.exezlink.exezlib.exezrc.exezmc.exezmt.exerL�include�libz/nologoz/Oxz/W3z/GLz/DNDEBUGz/MDz/MTz/Odz/MDdz/Ziz/D_DEBUGz/INCREMENTAL:NOz/LTCG�/nodefaultlib:libucrt.lib�ucrt.libz /DEBUG:FULL�/MANIFEST:EMBED,ID=1�/DLL�/MANIFEST:EMBED,ID=2�/MANIFESTUAC:NOFT)rjrk)rl)rl)rmrnro)rmrnro)(r �PLAT_TO_VCVARSrrQr/rZ�get�_pathsr0rr[r`�cc�linkerri�rc�mcZmt�_vcruntime_redistZadd_include_dir�rstrip�sepZadd_library_dirZpreprocess_options�compile_options�append�compile_options_debugr#Z ldflags_exeZldflags_exe_debugZldflags_sharedZldflags_shared_debugZldflags_staticZldflags_static_debugrZ EXECUTABLEZ SHARED_OBJECTZSHARED_LIBRARY�_ldflagsrd)rercr>Zvc_envr]�dir�ldflagsZ ldflags_debugr r r!� initialize�s`                      zMSVCCompiler.initializergcsT�fdd��jD��fdd��j�jD����p4d����fdd�}tt||��S)Ncsi|] }�j|�qSr )� obj_extension)r)�ext)rer r!rD8sz1MSVCCompiler.object_filenames..csi|] }�j|�qSr )� res_extension)r)r�)rer r!rD9srgc s�tjj|�\}}�r"tjj|�}n2tjj|�\}}|jtjjtjjf�rT|dd�}ytjj�|�|�St k r�t dj |���YnXdS)Nr8zDon't know how to compile {}) rr�splitext�basename� splitdrive� startswithry�altsepr.r<rrQ)r^�baser�rH)�ext_map� output_dir� strip_dirr r!� make_out_path>s z4MSVCCompiler.object_filenames..make_out_path)�src_extensions�_rc_extensions�_mc_extensions�list�map)reZsource_filenamesr�r�r�r )r�r�rer�r!�object_filenames3s zMSVCCompiler.object_filenamesc Cs�|js|j�|j||||||�} | \}} }} } |p6g} | jd�|rT| j|j�n | j|j�d}�x| D�]}y| |\}}Wntk r�wlYnX|r�tj j |�}||j kr�d|}�nD||j kr�d|}d}�n*||j k�rB|}d|}y|j|jg| ||g�Wqltk �r<}zt|��WYdd}~XqlXqln�||jk�r�tj j|�}tj j|�}y\|j|jd|d||g�tj jtj j|��\}}tj j||d �}|j|jd||g�Wqltk �r�}zt|��WYdd}~XqlXqlntd j||���|jg| | }|�r$|jd �|j|�|jd |�|j|�y|j|�Wqltk �r�}zt|��WYdd}~XqlXqlW| S) Nz/cFz/Tcz/TpTz/foz-hz-rz.rcz"Don't know how to compile {} to {}z/EHscz/Fo)rdr�Z_setup_compiler{r#r|rz�KeyErrorrrr\� _c_extensions�_cpp_extensionsr��spawnrurrr��dirnamervr�r�r.rQrs)reZsourcesr�ZmacrosZ include_dirsr� extra_preargs�extra_postargsZdependsZ compile_info�objectsZpp_optsZbuildZ compile_optsZ add_cpp_opts�obj�srcr�Z input_optZ output_opt�msgZh_dirZrc_dirr�rHZrc_file�argsr r r!�compileTsn               zMSVCCompiler.compilec Cs�|js|j�|j||�\}}|j||d�}|j||�r�|d|g}|rJy,tjd|jdj|��|j |jg|�Wq�t k r�}zt |��WYdd}~Xq�Xn tjd|�dS)N)r�z/OUT:zExecuting "%s" %s� zskipping %s (up-to-date)) rdr��_fix_object_args�library_filename� _need_linkr rrir.r�rr) rer�Zoutput_libnamer�r� target_lang�output_filenameZlib_argsr�r r r!�create_static_lib�s zMSVCCompiler.create_static_libcCs�|js|j�|j||�\}}|j|||�}|\}}}|rL|jdt|��t||||�}|dk rptjj ||�}|j ||��r�|j || f}dd�|p�gD�}||||d|g}tjj |d�} |dk �r tjj tjj|��\}}tjj | |j|��}|jd|�| �r| |dd�<| �r.|j| �tjj tjj|��}|j|�y6tjd|jdj |��|j|jg|�|j|�Wn,tk �r�}zt|��WYdd}~XnXn tjd |�dS) Nz5I don't know what to do with 'runtime_library_dirs': cSsg|] }d|�qS)z/EXPORT:r )r)Zsymr r r!� �sz%MSVCCompiler.link..z/OUT:rz/IMPLIB:zExecuting "%s" %sr�zskipping %s (up-to-date))rdr�r�Z _fix_lib_args�warn�strrrrr.r�r}r�r�r�r�r{r#r\Zmkpathr rrtr��_copy_vcruntimerr)reZ target_descr�r�r�Z librariesZ library_dirsZruntime_library_dirsZexport_symbolsrr�r�Z build_tempr�Z fixed_argsZlib_optsrZ export_optsZld_argsZdll_nameZdll_extZ implib_filer�r r r!�link�sN       zMSVCCompiler.linkcCs`|j}| stjj|� rdStjj|�j�tkr6dStjd|�t j ||�}tj |t j �dS)Nz Copying "%s")rwrrr=r�rB� _BUNDLED_DLLSr r�shutil�copy�chmod�stat�S_IWRITE)rer�r?r r r!r�s  zMSVCCompiler._copy_vcruntimec s4tjd�}z|jtjd<t�j|�S|tjd<XdS)Nr)rrMrrrN�superr�)rerUZold_path)� __class__r r!r�s    zMSVCCompiler.spawncCsd|S)Nz /LIBPATH:r )rer~r r r!�library_dir_option&szMSVCCompiler.library_dir_optioncCs td��dS)Nz:don't know how to set runtime library search path for MSVC)r)rer~r r r!�runtime_library_dir_option)sz'MSVCCompiler.runtime_library_dir_optioncCs |j|�S)N)r�)rerir r r!�library_option-szMSVCCompiler.library_optioncCs`|r|d|g}n|g}xB|D]6}x0|D](}tjj||j|��}tjj|�r(|Sq(WqWdSdS)NZ_d)rrr.r�r=)re�dirsrirZ try_namesr~r3Zlibfiler r r!�find_library_file0s    zMSVCCompiler.find_library_file)rrr)N)rrg)NNNrNNN)NrN) NNNNNrNNNN)r)�__name__� __module__� __qualname__Z compiler_typeZ executablesr�r�r�r�r�r�r�Zstatic_lib_extensionZshared_lib_extensionZstatic_lib_formatZshared_lib_formatZ exe_extensionrbr�r�r�r�r�r�r�r�r�r�r�� __classcell__r r )r�r!ra�sL   T  [  9 ra)N)rr�r�rPrZdistutils.errorsrrrrrZdistutils.ccompilerrrZ distutilsr Zdistutils.utilr � itertoolsr r"r4rArZr`rp� frozensetr�rar r r r!�s$   !"