o
     JAf'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 w d}d }| _ t D ]F}zt 	| |\}}}W n
 ty@   Y  n:w |ro|t j
krotj|roztt|}W n ttfya   Y q)w |dkro||kro||}}q)W d    ||fS W d    ||fS 1 sw   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.10/distutils/_msvccompiler.py_find_vc2015   sH   






r"   c               
   C   s   	 t jdpt jd} | sdS zt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y;   Y dS w t j|ddd}t j|rOd|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   s0   	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|s*t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| \}}|stdztjd|| tj	dj
ddd	}W n tjyI } zt|j td
|jd }~ww 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>   s    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   s2   


rS   c                 C   sP   	 |st dt j}|D ]}t jt j|| }t j|r%|  S q| S Nr   )r   rG   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|}|s"td|dd| _| jt	j
}td|| _td|| _td|| _td|| _td	|| _td
|| _|ddt	j
D ]}|rk| |t	j q^|ddt	j
D ]}|r| |t	j qvd | _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)rh   z/Odz/MDdz/Ziri   z/D_DEBUG)rh   /INCREMENTAL:NO/LTCG)rh   rj   rk   z/DEBUG:FULLz/MANIFEST:EMBED,ID=1z/DLLz/MANIFEST:EMBED,ID=2z/MANIFESTUAC:NOFT)%r
   PLAT_TO_VCVARSr   rI   tuplerS   r*   _pathsrU   r   rV   r[   cclinkerrg   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_ldflagsra   )rb   r`   r8   Zvc_envrX   dirldflagsZldflags_debugr    r    r!   
initialize   s`   





zMSVCCompiler.initializerf   c                    sX   i fddj D fddjj D  pd fdd}tt||S )Nc                       i | ]}| j qS r    )obj_extensionr>   extrb   r    r!   r@   "      z1MSVCCompiler.object_filenames.<locals>.<dictcomp>c                    r|   r    )res_extensionr~   r   r    r!   r@   #  r   rf   c                    s   t j| \}}rt j|}nt j|\}}|t jjt jjfr*|dd  }zt j| |  W S  t	yD   t
d| w )N   zDon't know how to compile {})r   r   splitextbasename
splitdrive
startswithru   altsepr-   LookupErrorr   rI   )rY   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)rb   Zsource_filenamesr   r   r   r    )r   r   rb   r   r!   object_filenames  s   zMSVCCompiler.object_filenamesc	                 C   sL  | j s|   | ||||||}	|	\}}
}}}|pg }|d |r*|| j n|| j d}|
D ]}z|| \}}W n	 tyG   Y q4w |rPtj	
|}|| jv rZd| }n|| jv rfd| }d}n|| jv r|}d| }z| | jg| ||g  W n ty } zt|d }~ww q4|| jv rtj	|}tj	|}z.| | jd|d||g tj	tj	|\}}tj	||d	 }| | jd| |g W n ty } zt|d }~ww q4td
||| jg| | }|r|d || |d|  || z| | W q4 ty# } zt|d }~ww |
S )Nz/cFz/Tcz/TpTz/foz-hz-rr^   z"Don't know how to compile {} to {}z/EHscz/Fo)ra   r{   Z_setup_compileappendextendrw   rv   KeyErrorr   r   rW   _c_extensions_cpp_extensionsr   spawnrq   r   r   r   dirnamerr   r   r   r-   rI   ro   )rb   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>  s   









zMSVCCompiler.compilec           	   
   C   s   | j s|   | ||\}}| j||d}| ||rN|d| g }|r&	 ztd| jd| | 	| jg|  W d S  t
yM } zt|d }~ww td| d S )N)r   /OUT:Executing "%s" %s skipping %s (up-to-date))ra   r{   _fix_object_argslibrary_filename
_need_linkr	   r   rg   r-   r   r   r   )	rb   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|   | ||\}}| |||}|\}}}|r&| dt|  t| |||}|d ur8tj	||}| 
||r| j||	f }dd |pKg D }|| | | d| g }tj|d }|d urtjtj|\}}tj	|| |}|d|  |
r|
|d d< |r|| tjtj|}| | ztd| jd	| | | jg|  W d S  ty } zt|d }~ww 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>  r   z%MSVCCompiler.link.<locals>.<listcomp>r   r   z/IMPLIB:r   r   r   )ra   r{   r   Z_fix_lib_argswarnstrr   r   r   r-   r   rx   r   r   r   r   r   r   rW   Zmkpathr	   r   rp   r   r   r   )rb   Ztarget_descr   r   r   Z	librariesZlibrary_dirsZruntime_library_dirsZexport_symbolsr   r   r   Z
build_tempr   Z
fixed_argsZlib_optsrz   Zexport_optsZld_argsZdll_nameZdll_extZimplib_filer   r    r    r!   link  sb   




zMSVCCompiler.linkc              	      s<   t d}z| jt jd< t |W |t jd< S |t jd< w rT   )r   rG   rn   r)   superr   )rb   rN   Zold_path	__class__r    r!   r     s
   
zMSVCCompiler.spawnc                 C   s   d| S )Nz	/LIBPATH:r    rb   ry   r    r    r!   library_dir_option  s   zMSVCCompiler.library_dir_optionc                 C   s   t d)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   )rb   rg   r    r    r!   library_option
  s   
zMSVCCompiler.library_optionc                 C   s\   |r	|d |g}n|g}|D ]}|D ]}t j|| |}t j|r*|    S qqd S )NZ_d)r   r   r-   r   r7   )rb   dirsrg   r   Z	try_namesry   nameZlibfiler    r    r!   find_library_file  s   zMSVCCompiler.find_library_file)r   r   r   r   )r   rf   )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]      s^    

P
"
]

Er]   r   )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;   rS   r[   rl   r]   r    r    r    r!   <module>   s2    !
