B YI~d/w�@sNddlZddlZddlZddlZddlmZmZmZmZm Z ddl m Z m Z m Z ddlmZddlmZddlZejZejZejZejZejejejejfZej dko�ej!dkZ"e"r�dZ#d Z$d Z%n d Z#d Z$d Z%ddd�Z&Gdd�d�Z'Gdd�d�Z(dd�Z)dd�Z*dd�Z+dd�Z,d#dd�Z-e)�Z.e.dk�r:ed e.��Gd!d"�d"e �Z/dS)$�N)�DistutilsExecError�DistutilsPlatformError� CompileError�LibError� LinkError)� CCompiler�gen_preprocess_options�gen_lib_options)�log)� get_platform�win32lz1Software\Wow6432Node\Microsoft\VisualStudio\%0.1fz5Software\Wow6432Node\Microsoft\Microsoft SDKs\Windowsz,Software\Wow6432Node\Microsoft\.NETFrameworkz%Software\Microsoft\VisualStudio\%0.1fz)Software\Microsoft\Microsoft SDKs\Windowsz Software\Microsoft\.NETFramework�x86Zamd64)r z win-amd64c@sLeZdZdd�Zee�Zdd�Zee�Zdd�Zee�Zdd�Zee�Zd S) �RegcCs:x,tD]$}|�||�}|r||kr||SqWt|��dS)N)�HKEYS� read_values�KeyError)�cls�path�key�base�d�r�t�d�d}YnX|rPtj�|�s�d|}tj � |d�}|r�tj�|�r�tj� |tj tj d�}tj� |�}tj�|�s�t�d|�dSnt�d|�|s�t�d�dStj� |d �}tj�|�r�|St�d �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)r6rrrr �debugrUr�isdir�environ�getrZ�pardir�abspath�isfile)r:r7r=ZtoolskeyZtoolsdir� vcvarsallrrr�find_vcvarsall�s2         rec Cs<t|�}ddddh}i}|dkr(td��t�d||�tjd||ftjtjd�}z�|��\}}|��d krzt|� d ���|� d �}xr|� d �D]d}t � |�}d |kr�q�|� �}|� d d �\} } | ��} | |kr�| �tj�r�| dd�} t| �|| <q�WWd|j��|j��Xt|�t|�k�r8ttt|������|S)N�include�libZlibpathrzUnable to find vcvarsall.batz'Calling 'vcvarsall.bat %s' (version=%s)z "%s" %s & set)�stdout�stderrrr+� �=rrF)rerr r]� subprocess�Popen�PIPEZ communicate�waitr*rPrr&�stripr%�endswithrUrYr\rh�closerirO� ValueError�str�list�keys) r:ZarchrdZ interesting�result�popenrhri�linerr(rrr�query_vcvarsall�s<          rzg @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.exercCs8t�||||�t|_d|_g|_d|_d|_d|_dS)NzSoftware\Microsoft\VisualStudioF) rr;�VERSION�_MSVCCompiler__versionZ_MSVCCompiler__root�_MSVCCompiler__paths� plat_name�_MSVCCompiler__arch� initialized)r9�verboseZdry_run�forcerrrr;IszMSVCCompiler.__init__NcCs|dkrt�}d}||kr(td|f��dtjkrfdtjkrf|�d�rfd|_d|_d|_d|_d |_ n�|t�ksx|d kr�t |}nt t�d t |}t t |�}|d � tj�|_|d tjd <|dtjd<t|j�dkr�td|j��|�d�|_|�d�|_|�d�|_|�d�|_|�d �|_ y,x&tjd � d�D]}|j�|��q||j k�r>|}d|}y"|�|jg| |g|g�Wqhtk �r8}z t|��Wdd}~XYqhXqhn�||jk�rtj �|�}tj �|�}yl|�|jgd|d|g|g�tj �tj �|��\}}tj �||d�}|�|jgd|g|g�Wqhtk �r�}z t|��Wdd}~XYqhXqhntd||f��d |}y&|�|jg| | ||g|�Wqhtk �rj}z t|��Wdd}~XYqhXqhW| 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�rrUrrb� _c_extensions�_cpp_extensionsr��spawnr�rrr��dirnamer�r�r�rZr�)r9Zsourcesr�r5Z 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||d�}|�||�r�|d|g}|rJy|�|jg|�Wq�tk r�}z t|��Wdd}~XYq�Xn t � d|�dS)N)r�z/OUT:zskipping %s (up-to-date)) r�r��_fix_object_args�library_filename� _need_linkr�rgrrr r]) r9r�Zoutput_libnamer�r]� target_lang�output_filenameZlib_argsr�rrr�create_static_libs zMSVCCompiler.create_static_libc CsX|js|��|�||�\}}|�|||�}|\}}}|rL|�dt|��t||||�}|dk rptj� ||�}|� ||��rH|t j kr�| r�|j dd�}q�|jdd�}n| r�|j }n|j}g}x|p�gD]}|�d|�q�W||||d|g}tj�|d�} |dk �rPtj�tj�|��\}}tj� | |�|��}|�d|�|�|| |�| �rp| |dd�<| �r�|�| �|�tj�|��y|�|jg|�Wn,tk �r�}z t|��Wdd}~XYnX|�||�}|dk �rT|\}}d||f}y|�dd d ||g�Wn,tk �rD}z t|��Wdd}~XYnXn t�d |�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�warnrtr rUrrZr�r� EXECUTABLEr�r�rr�r�r�r��manifest_setup_ldargsr�Zmkpathr�r�rr�manifest_get_embed_infor r])r9� 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�link6sl           zMSVCCompiler.linkcCs,tj�|tj�|�d�}|�d|�dS)Nz .manifestz/MANIFESTFILE:)rUrrZr�r)r9r�r�r�� temp_manifestrrrr��sz"MSVCCompiler.manifest_setup_ldargscCs`x,|D] }|�d�r|�dd�d}PqWdS|tjkr>d}nd}|�|�}|dkrXdS||fS)Nz/MANIFESTFILE:�:rrK)� startswithrPrr��_remove_visual_c_ref)r9r�r��argr�r�rrrr��s    z$MSVCCompiler.manifest_get_embed_infocCs�y�t|�}z |��}Wd|��Xt�dtj�}t�|d|�}d}t�|d|�}t�dtj�}t�||�dkrrdSt|d�}z|�|�|S|��XWnt k r�YnXdS)NzU|)r�z*\s*zI|)�w) �open�readrr�rer��DOTALLrE�search�write�OSError)r9Z manifest_fileZ manifest_fZ manifest_buf�patternrrrr��s.     z!MSVCCompiler._remove_visual_c_refcCsd|S)Nz /LIBPATH:r)r9�dirrrr�library_dir_option�szMSVCCompiler.library_dir_optioncCs td��dS)Nztjd�d�D]*}tj�tj�|�|�}tj�|�rH|SqHW|S)NZPathr�)r~rUrrZrbrcr_rP)r9Zexer@�fnrrrr�s   zMSVCCompiler.find_exe)rrr)N)rr�)NNNrNNN)NrN) NNNNNrNNNN)r)r/r0r1Z 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  W  V  R + r{)r )0rUrlrMr�Zdistutils.errorsrrrrrZdistutils.ccompilerrrr Z distutilsr Zdistutils.utilr �winregZ OpenKeyExrZEnumKeyrZ EnumValuer$�errorrZ HKEY_USERS�HKEY_CURRENT_USER�HKEY_LOCAL_MACHINEZHKEY_CLASSES_ROOTr�platform�maxsizeZ NATIVE_WIN64r6r?r>r�rr4rTrXr\rerzr|r{rrrr�sJ  >. # )