a
    åze'N  ã                   @   sÂ   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dddœZdd„ Zdd„ Zddd„Zdddddœ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  zt jt jdt jt jB d} W n ty<   t d¡ Y dS 0 d}d }| ¬ tƒ D ]”}zt  	| |¡\}}}W n ty„   Y  qèY n0 |rR|t j
krRtj |¡rRztt|ƒƒ}W n ttfyÊ   Y qRY n0 |dkrR||krR|| }}qRW d   ƒ n1  sþ0    Y  ||fS )Nz'Software\Microsoft\VisualStudio\SxS\VC7)ÚaccesszVisual C++ is not registered©NNr   é   )ÚwinregZ	OpenKeyExÚHKEY_LOCAL_MACHINEZKEY_READZKEY_WOW64_32KEYÚOSErrorr	   Údebugr   Z	EnumValueZREG_SZÚosÚpathÚisdirÚintÚfloatÚ
ValueErrorÚ	TypeError)ÚkeyÚbest_versionÚbest_dirÚiÚvZvc_dirZvtÚversion© r    ú-/usr/lib/python3.9/distutils/_msvccompiler.pyÚ_find_vc2015   s2    
ý



,r"   c               
   C   s    t j d¡pt j d¡} | s dS z8t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yt   Y dS 0 t j |ddd¡}t j |¡rœd|fS dS )NzProgramFiles(x86)ZProgramFilesr   z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é   )r   ÚenvironÚgetÚ
subprocessÚcheck_outputr   ÚjoinÚstripÚCalledProcessErrorr   ÚUnicodeDecodeErrorr   )Úrootr   r    r    r!   Ú_find_vc20178   s(    
úùr2   Úx86Zx64ZarmZarm64)r3   Ú	x86_amd64Úx86_armÚ	x86_arm64c                 C   s\   t ƒ \}}|stƒ \}}|s*t d¡ dS tj |d¡}tj |¡sTt d|¡ dS |d fS )Nz$No suitable Visual C++ version foundr   zvcvarsall.batz%s cannot be found)r2   r"   r	   r   r   r   r-   Úisfile)Ú	plat_specÚ_r   r   Ú	vcvarsallr    r    r!   Ú_find_vcvarsall_   s    


r;   c              
   C   sÀ   t  d¡rdd„ t j ¡ D ƒS t| ƒ\}}|s6tdƒ‚z&tjd || ¡tj	dj
ddd	}W nB tjyž } z(t |j¡ td
 |j¡ƒ‚W Y d }~n
d }~0 0 dd„ dd„ | ¡ D ƒD ƒ}|S )NZDISTUTILS_USE_SDKc                 S   s   i | ]\}}|  ¡ |“qS r    ©Úlower)Ú.0r   Úvaluer    r    r!   Ú
<dictcomp>s   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    r<   )r>   r   r9   r?   r    r    r!   r@   †   s   ýc                 s   s   | ]}|  d ¡V  qdS )ú=N)Ú	partition)r>   Úliner    r    r!   Ú	<genexpr>‰   ó    z_get_vc_env.<locals>.<genexpr>)r   Úgetenvr)   Úitemsr;   r   r+   r,   ÚformatÚSTDOUTÚdecoder/   r	   ÚerrorÚoutputÚcmdÚ
splitlines)r8   r:   r9   ÚoutÚexcÚenvr    r    r!   Ú_get_vc_envq   s.    
þ
þý
ÿýrT   c                 C   sN   |st  d¡ t j¡}|D ].}t j t j |¡| ¡}t j |¡r|  S q| S ©Nr   )r   rH   ÚsplitÚpathsepr   r-   Úabspathr7   )ZexeÚpathsÚpÚfnr    r    r!   Ú	_find_exe   s    	
r\   r4   r5   r6   )Úwin32z	win-amd64z	win-arm32z	win-arm64c                
       sÈ   e Zd ZdZi ZdgZg d¢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‡ fdd„Zdd„ Zdd „ Zd!d"„ Zd+d#d$„Z‡  ZS ),ÚMSVCCompilerZmsvcz.c)z.ccz.cppz.cxxú.rcz.mcz.resz.objz.libz.dllz%s%sz.exer   c                 C   s    t  | |||¡ d | _d| _d S )NF)r   Ú__init__Ú	plat_nameÚinitialized)ÚselfÚverboseÚdry_runÚforcer    r    r!   r`   É   s    zMSVCCompiler.__init__Nc                 C   s
  |d u rt ƒ }|tv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¡ t	j
¡D ]}|r¼|  | t	j¡¡ q¼| dd¡ t	j
¡D ]}|rì|  | t	j¡¡ qìd | _g d¢| _g d¢| _g d¢}g d¢}g |¢d‘| _g |¢d‘| _g |¢d‘d‘d‘| _g |¢d‘d‘d‘| _g |¢| _g |¢| _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.exeZincludeÚlib)ú/nologoz/Oxú/W3z/GLz/DNDEBUGz/MD)ri   z/Odz/MDdz/Zirj   z/D_DEBUG)ri   ú/INCREMENTAL:NOú/LTCG)ri   rk   rl   z/DEBUG:FULLz/MANIFEST:EMBED,ID=1z/DLLz/MANIFEST:EMBED,ID=2z/MANIFESTUAC:NOFT)%r
   ÚPLAT_TO_VCVARSr   rJ   ÚtuplerT   r*   Ú_pathsrV   r   rW   r\   ÚccÚlinkerrh   ÚrcÚmcÚmtZadd_include_dirÚrstripÚsepZadd_library_dirZpreprocess_optionsÚcompile_optionsÚcompile_options_debugZldflags_exeZldflags_exe_debugZldflags_sharedZldflags_shared_debugZldflags_staticZldflags_static_debugr   Z
EXECUTABLEZSHARED_OBJECTZSHARED_LIBRARYÚ_ldflagsrb   )rc   ra   r8   Zvc_envrY   ÚdirÚldflagsZldflags_debugr    r    r!   Ú
initializeÏ   s\    ÿ



÷zMSVCCompiler.initializerg   c                    sX   i ‡fdd„ˆj D ƒ¥‡fdd„ˆjˆj D ƒ¥‰ ˆp8d‰‡ ‡‡fdd„}tt||ƒƒS )Nc                    s   i | ]}|ˆ j “qS r    )Úobj_extension©r>   Úext©rc   r    r!   r@   "  rG   z1MSVCCompiler.object_filenames.<locals>.<dictcomp>c                    s   i | ]}|ˆ j “qS r    )Úres_extensionr~   r€   r    r!   r@   #  rG   rg   c                    s’   t j | ¡\}}ˆr"t j |¡}n2t j |¡\}}| t jjt jjf¡rT|dd … }zt j ˆ|ˆ |  ¡W S  t	yŒ   t
d | ¡ƒ‚Y n0 d S )Né   zDon't know how to compile {})r   r   ÚsplitextÚbasenameÚ
splitdriveÚ
startswithrv   Úaltsepr-   ÚLookupErrorr   rJ   )rZ   Úbaser   r9   )Ú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)rc   Zsource_filenamesrŒ   r‹   r   r    )rŠ   r‹   rc   rŒ   r!   Úobject_filenames  s    ÿþzMSVCCompiler.object_filenamesc	                 C   sŠ  | j s|  ¡  |  ||||||¡}	|	\}}
}}}|p6g }| d¡ |rT| | j¡ n| | j¡ d}|
D ]}z|| \}}W n ty”   Y qhY n0 |r¦tj	 
|¡}|| jv r¼d| }nH|| jv rÖd| }d}n.|| jv r@|}d| }z|  | jg| ||g ¡ W qh ty: } zt|ƒ‚W Y d }~qhd }~0 0 qhnÄ|| jv rôtj	 |¡}tj	 |¡}z\|  | jd|d||g¡ tj	 tj	 |¡¡\}}tj	 ||d	 ¡}|  | jd| |g¡ W qh tyî } zt|ƒ‚W Y d }~qhd }~0 0 qhntd
 ||¡ƒ‚| jg| | }|r$| d¡ | |¡ | d| ¡ | |¡ z|  |¡ W qh ty‚ } zt|ƒ‚W Y d }~qhd }~0 0 qh|
S )Nz/cFz/Tcz/TpTz/foz-hz-rr_   z"Don't know how to compile {} to {}z/EHscz/Fo)rb   r|   Z_setup_compileÚappendÚextendrx   rw   ÚKeyErrorr   r   rX   Ú_c_extensionsÚ_cpp_extensionsr   Úspawnrr   r   r   r   Údirnamers   rƒ   r„   r-   rJ   rp   )rc   Zsourcesr‹   ZmacrosZinclude_dirsr   Úextra_preargsÚextra_postargsZdependsZcompile_infoÚobjectsZpp_optsZbuildZcompile_optsZadd_cpp_optsÚobjÚsrcr   Z	input_optZ
output_optÚmsgZh_dirZrc_dirr‰   r9   Zrc_fileÚargsr    r    r!   Úcompile>  sr    
ÿ




ÿ


 zMSVCCompiler.compilec           	   
   C   s¶   | j s|  ¡  |  ||¡\}}| j||d}|  ||¡r¦|d| g }|rJz,t d| jd |¡¡ |  	| jg| ¡ W q² t
y¢ } zt|ƒ‚W Y d }~q²d }~0 0 nt d|¡ d S )N)r‹   ú/OUT:úExecuting "%s" %sú úskipping %s (up-to-date))rb   r|   Ú_fix_object_argsÚlibrary_filenameÚ
_need_linkr	   r   rh   r-   r™   r   r   )	rc   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 urptj 	||¡}|  
||¡rª| j||	f }dd„ |p˜g D ƒ}|| | | d| g }tj |d ¡}|d urtj tj |¡¡\}}tj 	||  |¡¡}| d| ¡ |
r|
|d d…< |r.| |¡ tj tj |¡¡}|  |¡ z,t d| jd 	|¡¡ |  | jg| ¡ W n. ty¦ } zt|ƒ‚W Y d }~n
d }~0 0 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    )r>   Zsymr    r    r!   Ú
<listcomp>Õ  rG   z%MSVCCompiler.link.<locals>.<listcomp>r£   r   z/IMPLIB:r¤   r¥   r¦   )rb   r|   r§   Z_fix_lib_argsÚwarnÚstrr   r   r   r-   r©   ry   rš   rƒ   r„   r¨   r”   r•   rX   Zmkpathr	   r   rq   r™   r   r   )rc   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²  s^    ÿ
ÿþ
ÿÿ

ÿþ

 zMSVCCompiler.linkc              	      s@   t  d¡}z$| jt jd< tƒ  |¡W |t jd< S |t jd< 0 d S rU   )r   rH   ro   r)   Úsuperr™   )rc   rO   Zold_path©Ú	__class__r    r!   r™   ÷  s    

þzMSVCCompiler.spawnc                 C   s   d| S )Nz	/LIBPATH:r    ©rc   rz   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   r´   r    r    r!   Úruntime_library_dir_option  s    ÿz'MSVCCompiler.runtime_library_dir_optionc                 C   s
   |   |¡S )N)r¨   )rc   rh   r    r    r!   Úlibrary_option
  s    zMSVCCompiler.library_optionc                 C   s\   |r|d |g}n|g}|D ]:}|D ]0}t j ||  |¡¡}t j |¡r$|    S q$qd S )NZ_d)r   r   r-   r¨   r7   )rc   Údirsrh   r   Z	try_namesrz   ÚnameZlibfiler    r    r!   Úfind_library_file  s    zMSVCCompiler.find_library_file)r   r   r   )N)r   rg   )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_extensionr`   r|   r“   r¢   r¬   r°   r™   rµ   r¶   r·   rº   Ú__classcell__r    r    r²   r!   r^   ª   sZ   ÿÿ

P  ý
"  þ
]   û
          ó
Er^   )N)r   r+   r   Zdistutils.errorsr   r   r   r   r   Zdistutils.ccompilerr   r   Z	distutilsr	   Zdistutils.utilr
   Ú	itertoolsr   r"   r2   ZPLAT_SPEC_TO_RUNTIMEr;   rT   r\   rm   r^   r    r    r    r!   Ú<module>   s.   !ü
ü