3 \�w�@sPddlZddlZddlZddlZddlmZmZmZmZm Z ddl m Z m Z m Z ddlmZddlmZddlZejZejZejZejZejejejejfZej dko�ej!d%kZ"e"r�d Z#d Z$d Z%n d Z#d Z$dZ%dddd�Z&Gdd�d�Z'Gdd�d�Z(dd�Z)dd�Z*dd�Z+dd�Z,d&dd �Z-e)�Z.e.d!k�rr?r;rHrrrrr7{sr7cCs�d}tjj|�}|d krdS|t|�}tj|d�jdd�\}}t|dd ��d}|dkrf|d7}t|dd��d}|dkr�d }|dkr�||SdS) NzMSC v.r�� r � �g$@r����������)�sysr=�find�len�split�int)�prefixr$r1�restZ majorVersionZ minorVersionrrr�get_build_version�s  rVcCs4g}x*|D]"}tjj|�}||kr |j|�q W|S)N)�osr�normpathr!)�pathsZ reduced_pathsrCZnprrr�normalize_and_reduce_paths�s   rZcCs@|jtj�}g}x|D]}||kr|j|�qWtjj|�}|S)N)rRrW�pathsepr!�join)ZvariableZoldListZnewListr$Z newVariablerrr�removeDuplicates�s   r]c Cst|}ytjd|d�}Wn"tk r>tjd�d}YnX| sTtjj|� r�d|}tj j |d�}|r�tjj|�r�tjj |tj tj d�}tjj |�}tjj|�s�tjd|�dSntjd|�|s�tjd�dStjj |d �}tjj|�r�|Stjd �dS) Nz %s\Setup\VCr@z%Unable to find productdir in registryzVS%0.f0COMNTOOLSZVCz%s is not a valid directoryz Env var %s is not set or invalidzNo productdir foundz vcvarsall.batzUnable to find vcvarsall.bat)r9rrrr �debugrWr�isdir�environ�getr\�pardir�abspath�isfile)r=r:r@ZtoolskeyZtoolsdir� vcvarsallrrr�find_vcvarsall�s2         rfc Cs8t|�}td�}i}|dkr$td��tjd||�tjd||ftjtjd�}z�|j�\}}|j �d krvt|j d ���|j d �}xr|j d �D]d}t j |�}d |kr�q�|j�}|j d d �\} } | j�} | |kr�| jtj�r�| dd�} t| �|| <q�WWd|jj�|jj�Xt|�t|�k�r4ttt|j�����|S)N�include�lib�libpathrzUnable to find vcvarsall.batz'Calling 'vcvarsall.bat %s' (version=%s)z "%s" %s & set)�stdout�stderrrr.� �=r)rgrhrirrM)rf�setrr r^� subprocess�Popen�PIPEZ communicate�waitr-rRrr)�stripr(�endswithrWr[r]rj�closerkrQ� ValueError�str�list�keys) r=ZarchreZ interesting�result�popenrjrk�linerr+rrr�query_vcvarsall�s<         r}g @z(VC %0.1f is not supported by this modulec @s�eZdZdZiZdgZdddgZdgZdgZeeeeZ dZ d Z d Z d Z d ZZd Zd-dd�Zd.dd�Zd/dd�Zd0dd�Zd1dd�Zd2dd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd3d)d*�Zd+d,�ZdS)4� MSVCCompilerZmsvcz.cz.ccz.cppz.cxxz.rcz.mcz.resz.objz.libz.dllz%s%sz.exercCs8tj||||�t|_d|_g|_d|_d|_d|_dS)NzSoftware\Microsoft\VisualStudioF) rr>�VERSION�_MSVCCompiler__versionZ_MSVCCompiler__root�_MSVCCompiler__paths� plat_name�_MSVCCompiler__arch� initialized)r<�verboseZdry_runZforcerrrr>JszMSVCCompiler.__init__NcCs|dkrt�}d$}||kr(td|f��dtjkrfdtjkrf|jd�rfd|_d|_d |_d |_d |_ n�|t�ksx|dkr�t |}nt t�d t |}t t |�}|d j tj�|_|dtjd<|dtjd<t|j�dkr�td|j��|jd�|_|jd�|_|jd �|_|jd �|_|jd �|_ y,x&tjd j d�D]}|jj|��q||j k�r>|}d|}y"|j|jg| |g|g�Wqhtk �r8}zt|��WYdd}~XqhXqhn�||jk�rtj j|�}tj j|�}yl|j|jgd|d|g|g�tj jtj j|��\}}tj j||d�}|j|jgd|g|g�Wqhtk �r�}zt|��WYdd}~XqhXqhntd||f��d |}y&|j|jg| | ||g|�Wqhtk �rj}zt|��WYdd}~XqhXqhW| S) Nz/cz/Tcz/Tpz/foz-hz-rz.rcz"Don't know how to compile %s to %sz/Fo)r�r�Z_setup_compiler!�extendr�r�rrWrrc� _c_extensions�_cpp_extensionsr��spawnr�rrr��dirnamer�r�r�r\r�)r<Zsourcesr�r8Z include_dirsr^� extra_preargs�extra_postargsZdependsZ compile_info�objectsZpp_optsZbuildZ compile_opts�obj�srcr�Z input_optZ output_opt�msgZh_dirZrc_dirrr�Zrc_filerrr�compile�sj              zMSVCCompiler.compilec Cs�|js|j�|j||�\}}|j||d�}|j||�r�|d|g}|rJy|j|jg|�Wq�tk r�}zt|��WYdd}~Xq�Xn t j d|�dS)N)r�z/OUT:zskipping %s (up-to-date)) r�r��_fix_object_args�library_filename� _need_linkr�rhrrr r^) r<r�Zoutput_libnamer�r^� target_lang�output_filenameZlib_argsr�rrr�create_static_libs zMSVCCompiler.create_static_libcCsX|js|j�|j||�\}}|j|||�}|\}}}|rL|jdt|��t||||�}|dk rptjj ||�}|j ||��rH|t j kr�| r�|j dd�}q�|jdd�}n| r�|j }n|j}g}x|p�gD]}|jd|�q�W||||d|g}tjj|d�} |dk �rPtjjtjj|��\}}tjj | |j|��}|jd|�|j|| |�| �rp| |dd�<| �r�|j| �|jtjj|��y|j|jg|�Wn,tk �r�}zt|��WYdd}~XnX|j||�}|dk �rT|\}}d||f}y|jdd d ||g�Wn,tk �rD}zt|��WYdd}~XnXn tjd |�dS) Nz5I don't know what to do with 'runtime_library_dirs': rz/EXPORT:z/OUT:rz/IMPLIB:z-outputresource:%s;%szmt.exez-nologoz -manifestzskipping %s (up-to-date))r�r�r�Z _fix_lib_args�warnrwr rWrr\r�r� EXECUTABLEr�r�r!r�r�r�r��manifest_setup_ldargsr�Zmkpathr�r�rr�manifest_get_embed_infor r^)r<� target_descr�r�r�Z librariesZ library_dirsZruntime_library_dirsZexport_symbolsr^r�r�� build_tempr�Z fixed_argsZlib_optsZldflagsZ export_optsZsym�ld_argsZdll_nameZdll_extZ implib_filer�ZmfinfoZ mffilename�mfidZout_argrrr�link8sl           zMSVCCompiler.linkcCs,tjj|tjj|�d�}|jd|�dS)Nz .manifestz/MANIFESTFILE:)rWrr\r�r!)r<r�r�r�� temp_manifestrrrr��sz"MSVCCompiler.manifest_setup_ldargscCs`x,|D] }|jd�r|jdd�d}PqWdS|tjkr>d}nd}|j|�}|dkrXdS||fS)Nz/MANIFESTFILE:�:rr )� startswithrRrr��_remove_visual_c_ref)r<r�r��argr�r�rrrr��s    z$MSVCCompiler.manifest_get_embed_infocCs�y�t|�}z |j�}Wd|j�Xtjdtj�}tj|d|�}d}tj|d|�}tjdtj�}tj||�dkrrdSt|d�}z|j|�|S|j�XWnt k r�YnXdS)NzU|)r�z*\s*zI|)�w) �open�readru�rer��DOTALLrH�search�write�OSError)r<Z manifest_fileZ manifest_fZ manifest_buf�patternrrrr��s.     z!MSVCCompiler._remove_visual_c_refcCsd|S)Nz /LIBPATH:r)r<�dirrrr�library_dir_option�szMSVCCompiler.library_dir_optioncCs td��dS)Nztjdjd�D]*}tjjtjj|�|�}tjj|�rH|SqHW|S)NZPathr�)r�rWrr\rcrdr`rR)r<ZexerC�fnrrrr�s   zMSVCCompiler.find_exe)rrr)N)rr�)NNNrNNN)NrN) NNNNNrNNNN)r)r2r3r4Z compiler_typeZ executablesr�r�r�r�r�r�r�Zstatic_lib_extensionZshared_lib_extensionZstatic_lib_formatZshared_lib_formatZ exe_extensionr>r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr~,sP  X  V  R + r~l)r)0rWrorOr�Zdistutils.errorsrrrrrZdistutils.ccompilerrrr Z distutilsr Zdistutils.utilr �winregZ OpenKeyExrZEnumKeyr Z EnumValuer'�errorrZ HKEY_USERS�HKEY_CURRENT_USER�HKEY_LOCAL_MACHINEZHKEY_CLASSES_ROOTr�platform�maxsizeZ NATIVE_WIN64r9rBrAr�rr7rVrZr]rfr}rr~rrrr�sL  >. # )