B
    0*™\³V  ã               @   sÊ   d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZ d dlmZ dd„ Zd	d
„ Zdd„ Zdd„ Zddd„ZdddœZedgƒZG dd„ deƒZdS )é    N)ÚDistutilsExecErrorÚDistutilsPlatformErrorÚCompileErrorÚLibErrorÚ	LinkError)Ú	CCompilerÚgen_lib_options)Úlog)Úget_platform)Úcountc              C   sü   yt jt jdt jt jB d} W n tk
r<   t d¡ dS X d}d }| ¤ xœtƒ D ]’}yt  	| |¡\}}}W n tk
r„   P Y nX |rT|t j
krTtj |¡rTytt|ƒƒ}W n ttfk
rÊ   wTY nX |dkrT||krT|| }}qTW W d Q R X ||fS )Nz'Software\Microsoft\VisualStudio\SxS\VC7)ÚaccesszVisual C++ is not registered)NNr   é   )ÚwinregÚ	OpenKeyExÚHKEY_LOCAL_MACHINEÚKEY_READÚKEY_WOW64_32KEYÚOSErrorr	   Údebugr   Ú	EnumValueÚREG_SZÚosÚpathÚisdirÚintÚfloatÚ
ValueErrorÚ	TypeError)ÚkeyÚbest_versionÚbest_dirÚiÚvZvc_dirZvtÚversion© r$   úBC:\ALexclude\prg\programme\Python37\Lib\distutils\_msvccompiler.pyÚ_find_vc2015   s0    
r&   c           
   C   s¨   dd l } tj d¡ptj d¡}|s(dS y8tjtj |ddd¡dd	d
dddddg	ddd ¡ }W n tj	t
tfk
r|   dS X tj |ddd¡}tj |¡r¤d|fS dS )Nr   zProgramFiles(x86)ZProgramFiles)NNzMicrosoft Visual StudioZ	Installerzvswhere.exez-latestz-prereleasez	-requiresz1Microsoft.VisualStudio.Component.VC.Tools.x86.x64z	-propertyZinstallationPathz	-productsÚ*ÚmbcsÚstrict)ÚencodingÚerrorsZVCZ	AuxiliaryZBuildé   )Újsonr   ÚenvironÚgetÚ
subprocessÚcheck_outputr   ÚjoinÚstripÚCalledProcessErrorr   ÚUnicodeDecodeErrorr   )r-   Úrootr   r$   r$   r%   Ú_find_vc2017:   s&    
r7   c       	   
   C   s  t ƒ \}}d }d| krdnd}|rztj |ddddddd	¡}yd
d l}|j|ddd }W n tttfk
rx   d }Y nX |s tƒ \}}|r tj |d|dd	¡}|s²t	 
d¡ dS tj |d¡}tj |¡sÜt	 
d|¡ dS |rìtj |¡süt	 
d|¡ d }||fS )NZamd64Zx64Úx86z..ZredistZMSVCz**zMicrosoft.VC141.CRTzvcruntime140.dllr   T)Ú	recursiveéÿÿÿÿzMicrosoft.VC140.CRTz$No suitable Visual C++ version found)NNzvcvarsall.batz%s cannot be found)r7   r   r   r2   ÚglobÚImportErrorr   ÚLookupErrorr&   r	   r   Úisfile)	Ú	plat_specÚ_r    Ú	vcruntimeZvcruntime_platZvcredistr;   r   Ú	vcvarsallr$   r$   r%   Ú_find_vcvarsall\   s6    



rC   c          
   C   sÊ   t  d¡rdd„ t j ¡ D ƒS t| ƒ\}}|s6tdƒ‚y&tjd || ¡tj	dj
ddd	}W n@ tjk
rœ } z t |j¡ td
 |j¡ƒ‚W d d }~X Y nX dd„ dd„ | ¡ D ƒD ƒ}|rÆ||d< |S )NZDISTUTILS_USE_SDKc             S   s   i | ]\}}||  ¡ “qS r$   )Úlower)Ú.0r   Úvaluer$   r$   r%   ú
<dictcomp>€   s   z_get_vc_env.<locals>.<dictcomp>zUnable to find vcvarsall.batzcmd /u /c "{}" {} && set)Ústderrzutf-16leÚreplace)r+   zError executing {}c             S   s$   i | ]\}}}|r|r||  ¡ “qS r$   )rD   )rE   r   r@   rF   r$   r$   r%   rG   “   s   c             s   s   | ]}|  d ¡V  qdS )ú=N)Ú	partition)rE   Úliner$   r$   r%   ú	<genexpr>–   s    z_get_vc_env.<locals>.<genexpr>Úpy_vcruntime_redist)r   Úgetenvr.   ÚitemsrC   r   r0   r1   ÚformatZSTDOUTÚdecoder4   r	   ÚerrorÚoutputÚcmdÚ
splitlines)r?   rB   rA   ÚoutÚexcÚenvr$   r$   r%   Ú_get_vc_env~   s(    


rZ   c             C   sN   |st  d¡ t j¡}x2|D ]*}t j t j |¡| ¡}t j |¡r|S qW | S )Nr   )r   rO   ÚsplitÚpathsepr   r2   Úabspathr>   )ZexeÚpathsÚpÚfnr$   r$   r%   Ú	_find_exež   s    	
ra   r8   Z	x86_amd64)Úwin32z	win-amd64zvcruntime140.dllc            
       sÒ   e Zd ZdZi ZdgZdddgZdgZdgZee e e Z	dZ
d	Zd
ZdZd ZZdZd)dd„Zd*dd„Zd+dd„Zd,dd„Zd-dd„Zd.dd„Zdd„ Z‡ fdd „Zd!d"„ Zd#d$„ Zd%d&„ Zd/d'd(„Z‡  ZS )0ÚMSVCCompilerZmsvcz.cz.ccz.cppz.cxxz.rcz.mcz.resz.objz.libz.dllz%s%sz.exer   c             C   s    t  | |||¡ d | _d| _d S )NF)r   Ú__init__Ú	plat_nameÚinitialized)ÚselfÚverboseZdry_runÚforcer$   r$   r%   rd   Ü   s    zMSVCCompiler.__init__Nc             C   s>  |d krt ƒ }|tkr(td ttƒ¡ƒ‚t| }t|ƒ}|sDtdƒ‚| dd¡| _| j t	j
¡}td|ƒ| _td|ƒ| _td|ƒ| _td|ƒ| _td	|ƒ| _td
|ƒ| _| dd¡| _x2| dd¡ t	j
¡D ]}|rÌ|  | t	j¡¡ qÌW x6| dd¡ t	j
¡D ]}|r |  | t	j¡¡ q W d | _dddddg| _| j | jrJdnd¡ ddddddg| _dddg}| js~| d¡ ddddg}|d#•| _|d$•| _|d%•| _|d&•| _|•| _ |•| _!t"j#d f| jt"j#d!f| jt"j#d"f| jt"j$d f| jt"j$d!f| jt"j$d"f| jt"j%d f| j t"j%d!f| j t"j%d"f| j!i	| _&d"| _'d S )'Nz--plat-name must be one of {}z7Unable to find a compatible Visual Studio installation.r   Ú zcl.exezlink.exezlib.exezrc.exezmc.exezmt.exerN   ZincludeÚlibz/nologoz/Oxz/W3z/GLz/DNDEBUGz/MDz/MTz/Odz/MDdz/Ziz/D_DEBUGz/INCREMENTAL:NOz/LTCG)z/nodefaultlib:libucrt.libzucrt.libz/DEBUG:FULLú/MANIFEST:EMBED,ID=1ú/DLLú/MANIFEST:EMBED,ID=2ú/MANIFESTUAC:NOFT)rl   )rl   )rm   rn   ro   )rm   rn   ro   )(r
   ÚPLAT_TO_VCVARSr   rQ   ÚtuplerZ   r/   Ú_pathsr[   r   r\   ra   ÚccÚlinkerrk   ÚrcÚmcÚmtÚ_vcruntime_redistZadd_include_dirÚrstripÚsepZadd_library_dirZpreprocess_optionsÚcompile_optionsÚappendÚcompile_options_debugÚextendZldflags_exeZldflags_exe_debugZldflags_sharedZldflags_shared_debugZldflags_staticZldflags_static_debugr   Z
EXECUTABLEZSHARED_OBJECTZSHARED_LIBRARYÚ_ldflagsrf   )rg   re   r?   Zvc_envr^   ÚdirÚldflagsZldflags_debugr$   r$   r%   Ú
initializeâ   s`    





zMSVCCompiler.initializerj   c                sT   ‡fdd„ˆj D ƒ‡fdd„ˆjˆj D ƒ–‰ ˆp4d‰‡ ‡‡fdd„}tt||ƒƒS )Nc                s   i | ]}ˆ j |“qS r$   )Úobj_extension)rE   Úext)rg   r$   r%   rG   9  s    z1MSVCCompiler.object_filenames.<locals>.<dictcomp>c                s   i | ]}ˆ j |“qS r$   )Úres_extension)rE   r„   )rg   r$   r%   rG   :  s    rj   c                s’   t j | ¡\}}ˆr"t j |¡}n2t j |¡\}}| t jjt jjf¡rT|dd … }yt j ˆ|ˆ |  ¡S  t	k
rŒ   t
d | ¡ƒ‚Y nX d S )Né   zDon't know how to compile {})r   r   ÚsplitextÚbasenameÚ
splitdriveÚ
startswithrz   Úaltsepr2   r=   r   rQ   )r_   Úbaser„   r@   )Úext_mapÚ
output_dirÚ	strip_dirr$   r%   Úmake_out_path?  s    z4MSVCCompiler.object_filenames.<locals>.make_out_path)Úsrc_extensionsÚ_rc_extensionsÚ_mc_extensionsÚlistÚmap)rg   Zsource_filenamesr   rŽ   r   r$   )r   rŽ   rg   r   r%   Úobject_filenames4  s
    zMSVCCompiler.object_filenamesc	             C   sŠ  | j s|  ¡  |  ||||||¡}	|	\}}
}}}|p6g }| d¡ |rT| | j¡ n| | j¡ d}x|
D ]}y|| \}}W n tk
r˜   wlY nX |rªtj	 
|¡}|| jkrÀd| }nD|| jkrÚd| }d}n*|| jkrB|}d| }y|  | jg| ||g ¡ W ql tk
r< } zt|ƒ‚W d d }~X Y qlX qlnÂ|| jkrôtj	 |¡}tj	 |¡}y\|  | jd|d||g¡ tj	 tj	 |¡¡\}}tj	 ||d	 ¡}|  | jd| |g¡ W ql tk
rî } zt|ƒ‚W d d }~X Y qlX qlntd
 ||¡ƒ‚| jg| | }|r$| d¡ | |¡ | d| ¡ | |¡ y|  |¡ W ql tk
r€ } zt|ƒ‚W d d }~X Y qlX qlW |
S )Nz/cFz/Tcz/TpTz/foz-hz-rz.rcz"Don't know how to compile {} to {}z/EHscz/Fo)rf   r‚   Z_setup_compiler|   r~   r}   r{   ÚKeyErrorr   r   r]   Ú_c_extensionsÚ_cpp_extensionsr’   Úspawnru   r   r   r“   Údirnamerv   r‡   rˆ   r2   rQ   rs   )rg   ZsourcesrŽ   ZmacrosZinclude_dirsr   Úextra_preargsÚextra_postargsZdependsZcompile_infoÚobjectsZpp_optsÚbuildZcompile_optsZadd_cpp_optsÚobjÚsrcr„   Z	input_optZ
output_optÚmsgZh_dirZrc_dirrŒ   r@   Zrc_fileÚargsr$   r$   r%   ÚcompileU  sn    








zMSVCCompiler.compilec       	   
   C   s´   | j s|  ¡  |  ||¡\}}| j||d}|  ||¡r¤|d| g }|rJy,t d| jd |¡¡ |  	| jg| ¡ W q° t
k
r  } zt|ƒ‚W d d }~X Y q°X nt d|¡ d S )N)rŽ   z/OUT:zExecuting "%s" %sú zskipping %s (up-to-date))rf   r‚   Ú_fix_object_argsÚlibrary_filenameÚ
_need_linkr	   r   rk   r2   rš   r   r   )	rg   rž   Zoutput_libnamerŽ   r   Útarget_langÚoutput_filenameZlib_argsr¢   r$   r$   r%   Úcreate_static_lib¯  s    zMSVCCompiler.create_static_libc          
   C   sÂ  | j s|  ¡  |  ||¡\}}|  |||¡}|\}}}|rL|  dt|ƒ ¡ t| |||ƒ}|d k	rptj 	||¡}|  
||¡r²| j||	f }dd„ |p˜g D ƒ}|| | | d| g }tj |d ¡}|d k	rtj tj |¡¡\}}tj 	||  |¡¡}| d| ¡ |
r|
|d d…< |r.| |¡ tj tj |¡¡}|  |¡ y6t d| jd 	|¡¡ |  | jg| ¡ |  |¡ W n, tk
r® } zt|ƒ‚W d d }~X Y nX nt d	|¡ d S )
Nz5I don't know what to do with 'runtime_library_dirs': c             S   s   g | ]}d | ‘qS )z/EXPORT:r$   )rE   Zsymr$   r$   r%   ú
<listcomp>ì  s    z%MSVCCompiler.link.<locals>.<listcomp>z/OUT:r   z/IMPLIB:zExecuting "%s" %sr¥   zskipping %s (up-to-date))rf   r‚   r¦   Z_fix_lib_argsÚwarnÚstrr   r   r   r2   r¨   r   r›   r‡   rˆ   r§   r|   r~   r]   Zmkpathr	   r   rt   rš   Ú_copy_vcruntimer   r   )rg   Ztarget_descrž   rª   rŽ   Z	librariesZlibrary_dirsZruntime_library_dirsZexport_symbolsr   rœ   r   Z
build_tempr©   Z
fixed_argsZlib_optsr   Zexport_optsZld_argsZdll_nameZdll_extZimplib_filer¢   r$   r$   r%   ÚlinkÉ  sN    



zMSVCCompiler.linkc             C   s\   | j }|rtj |¡sd S tj |¡ ¡ tkr2d S t d|¡ t	 
||¡}t |tj¡ d S )NzCopying "%s")rx   r   r   r>   rˆ   rD   Ú_BUNDLED_DLLSr	   r   ÚshutilÚcopyÚchmodÚstatÚS_IWRITE)rg   rŽ   rA   r$   r$   r%   r¯     s    zMSVCCompiler._copy_vcruntimec          	      s4   t  d¡}z| jt jd< tƒ  |¡S |t jd< X d S )Nr   )r   rO   rr   r.   Úsuperrš   )rg   rU   Zold_path)Ú	__class__r$   r%   rš     s
    
zMSVCCompiler.spawnc             C   s   d| S )Nz	/LIBPATH:r$   )rg   r€   r$   r$   r%   Úlibrary_dir_option'  s    zMSVCCompiler.library_dir_optionc             C   s   t dƒ‚d S )Nz:don't know how to set runtime library search path for MSVC)r   )rg   r€   r$   r$   r%   Úruntime_library_dir_option*  s    z'MSVCCompiler.runtime_library_dir_optionc             C   s
   |   |¡S )N)r§   )rg   rk   r$   r$   r%   Úlibrary_option.  s    zMSVCCompiler.library_optionc             C   s`   |r|d |g}n|g}xB|D ]6}x0|D ](}t j ||  |¡¡}t j |¡r(|S q(W qW d S d S )NZ_d)r   r   r2   r§   r>   )rg   Údirsrk   r   Z	try_namesr€   ÚnameZlibfiler$   r$   r%   Úfind_library_file1  s    

zMSVCCompiler.find_library_file)r   r   r   )N)r   rj   )NNNr   NNN)Nr   N)
NNNNNr   NNNN)r   )Ú__name__Ú
__module__Ú__qualname__Zcompiler_typeZexecutablesr˜   r™   r’   r“   r‘   r…   rƒ   Zstatic_lib_extensionZshared_lib_extensionZstatic_lib_formatZshared_lib_formatZexe_extensionrd   r‚   r–   r¤   r«   r°   r¯   rš   r¹   rº   r»   r¾   Ú__classcell__r$   r$   )r¸   r%   rc   ½   sL   


T 
 
[  
         
9rc   )N)r   r²   rµ   r0   r   Zdistutils.errorsr   r   r   r   r   Zdistutils.ccompilerr   r   Z	distutilsr	   Zdistutils.utilr
   Ú	itertoolsr   r&   r7   rC   rZ   ra   rp   Ú	frozensetr±   rc   r$   r$   r$   r%   Ú<module>   s$   "" 

