o
     JAfv                     @   sJ  	 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ZejZejZejZejZejejejejfZejdkoVej dkZ!e!r`dZ"d	Z#d
Z$ndZ"dZ#dZ$dddZ%G dd dZ&G dd dZ'dd Z(dd Z)dd Z*dd Z+d#ddZ,e( Z-e-dk red e- G d!d" d"eZ.dS )$    N)DistutilsExecErrorDistutilsPlatformErrorCompileErrorLibError	LinkError)	CCompilergen_lib_options)log)get_platformwin32l        z1Software\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x86Zamd64r   z	win-amd64c                   @   sN   e Zd Z	 dd ZeeZdd ZeeZdd ZeeZdd ZeeZd	S )
Regc                 C   s6   t D ]}| ||}|r||v r||   S qt|N)HKEYSread_valuesKeyError)clspathkeybased r   ./usr/lib/python3.10/distutils/msvc9compiler.py	get_value?   s   zReg.get_valuec                 C   sh   	 zt ||}W n
 ty   Y d S w g }d}	 zt||}W n
 ty)   Y |S w || |d7 }qNr   T   )RegOpenKeyExRegError
RegEnumKeyappend)r   r   r   handleLikr   r   r   	read_keysG   s$   
zReg.read_keysc           	      C   s   	 zt ||}W n
 ty   Y d S w i }d}	 z
t||\}}}W n
 ty,   Y |S w | }| ||| |< |d7 }qr   )r   r   RegEnumValuelowerconvert_mbcs)	r   r   r   r!   r   r#   namevaluetyper   r   r   r   Y   s&   zReg.read_valuesc                 C   s<   t | dd }|d urz|d} W | S  ty   Y | S w | S )Ndecodembcs)getattrUnicodeError)sZdecr   r   r   r(   o   s   
zReg.convert_mbcsN)	__name__
__module____qualname__r   classmethodr%   r   r(   staticmethodr   r   r   r   r   ;   s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
MacroExpanderc                 C   s   i | _ t| | _| | d S r   )macrosVS_BASEvsbaseload_macros)selfversionr   r   r   __init__{   s   
zMacroExpander.__init__c                 C   s   t ||| jd| < d S )Nz$(%s))r   r   r7   )r;   Zmacror   r   r   r   r   	set_macro   s   zMacroExpander.set_macroc              	   C   s   |  d| jd d |  d| jd d |  dtd z|dkr(|  d	td
 ntd
W n ty8   tdw |dkrN|  d| jd |  dtd d S d}tD ])}zt||}W n	 tyd   Y qRw t	|d}t
|d||f }|d | jd< qRd S )NZVCInstallDirz	\Setup\VC
productdirZVSInstallDirz	\Setup\VSZFrameworkDirZinstallroot       @ZFrameworkSDKDirzsdkinstallrootv2.0a  Python was built with Visual Studio 2008;
extensions must be built with a compiler than can generate compatible binaries.
Visual Studio 2008 was not found on this system. If you have Cygwin installed,
you can try compiling with MingW32, by passing "-c mingw32" to setup.py.g      "@ZFrameworkVersionzclr versionZWindowsSdkDirZcurrentinstallfolderz.Software\Microsoft\NET Framework Setup\Productr   z%s\%sr<   z$(FrameworkVersion))r>   r9   NET_BASEr   r   WINSDK_BASEr   r   r   r   r   r   r7   )r;   r<   pr   hr   r   r   r   r   r:      s:   
zMacroExpander.load_macrosc                 C   s$   | j  D ]
\}}|||}q|S r   )r7   itemsreplace)r;   r0   r$   vr   r   r   sub   s   zMacroExpander.subN)r1   r2   r3   r=   r>   r:   rH   r   r   r   r   r6   y   s
    r6   c                  C   s   	 d} t j| }|dkrdS |t|  }t j|d  dd\}}t|d d d }|dkr4|d7 }t|dd	 d
 }|dkrDd}|dkrL|| S d S )NzMSC v.    r            g      $@r   )sysr<   findlensplitint)prefixr#   r0   restZmajorVersionZminorVersionr   r   r   get_build_version   s    rW   c                 C   s2   	 g }| D ]}t j|}||vr|| q|S r   )osr   normpathr    )pathsZreduced_pathsrC   Znpr   r   r   normalize_and_reduce_paths   s   
r[   c                 C   s>   	 |  tj}g }|D ]}||vr|| qtj|}|S r   )rS   rX   pathsepr    join)variableZoldListZnewListr#   ZnewVariabler   r   r   removeDuplicates   s   
r_   c                 C   s  	 t |  }z
td| d}W n ty   td d }Y nw |r(tj|scd|  }tj	
|d }|r\tj|r\tj|tjtjd}tj|}tj|s[td|  d S ntd|  |sltd d S tj|d	}tj|r{|S td
 d S )Nz%s\Setup\VCr?   z%Unable to find productdir in registryzVS%0.f0COMNTOOLSZVCz%s is not a valid directoryz Env var %s is not set or invalidzNo productdir foundzvcvarsall.batUnable to find vcvarsall.bat)r8   r   r   r   r	   debugrX   r   isdirenvirongetr]   pardirabspathisfile)r<   r9   r?   ZtoolskeyZtoolsdir	vcvarsallr   r   r   find_vcvarsall   s:   



ri   c                 C   sH  	 t | }h d}i }|d u rtdtd||  tjd||f tjtjd}z\| \}}| dkr<t|	d|	d}|
dD ]2}t|}d	|vrRqF| }|
d	d
\}	}
|	 }	|	|v rx|
tjrr|
d d }
t|
||	< qFW |j  |j  n|j  |j  w t|t|krttt| |S )N>   libZlibpathincluder   r`   z'Calling 'vcvarsall.bat %s' (version=%s)z"%s" %s & set)stdoutstderrr   r-   
=r   rI   )ri   r   r	   ra   
subprocessPopenPIPEcommunicatewaitr,   rS   r   r(   stripr'   endswithrX   r\   r_   rl   closerm   rR   
ValueErrorstrlistkeys)r<   Zarchrh   Zinterestingresultpopenrl   rm   liner   r*   r   r   r   query_vcvarsall   sH   



r   r@   z(VC %0.1f is not supported by this modulec                   @   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										d0ddZdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd1d'd(Zd)d* ZdS )2MSVCCompilerZmsvcz.c)z.ccz.cppz.cxx.rcz.mcz.resz.objz.libz.dllz%s%sz.exer   c                 C   s8   t | ||| t| _d| _g | _d | _d | _d| _d S )NzSoftware\Microsoft\VisualStudioF)	r   r=   VERSION_MSVCCompiler__versionZ_MSVCCompiler__root_MSVCCompiler__paths	plat_name_MSVCCompiler__archinitialized)r;   verbosedry_runforcer   r   r   r=   H  s   
zMSVCCompiler.__init__Nc                 C   s  |d u rt  }d}||vrtd|f dtjv r3dtjv r3| dr3d| _d| _d| _d| _d	| _	na|t  ks<|d
krAt
| }nt
t   d t
|  }tt|}|d tj| _|d tjd< |d tjd< t| jdkrvtd| j | d| _| d| _| d| _| d| _| d	| _	ztjd dD ]}| j| qW n	 ty   Y nw t| j| _d| jtjd< d | _| jdkrg d| _g d| _n
g d| _g d| _g d| _| jdkrg d| _dg| _d| _d S )Nr   z--plat-name must be one of %sZDISTUTILS_USE_SDKZMSSdkzcl.exezlink.exezlib.exezrc.exezmc.exer   _r   rj   rk   r   zxPython was built with %s, and extensions need to be built with the same version of the compiler, but it isn't installed.;r   )/nologo/Ox/MD/W3/DNDEBUG)r   /Od/MDdr   /Z7/D_DEBUG)r   r   r   r   /GS-r   )r   r   r   r   r   r   r   )/DLLr   z/INCREMENTAL:NO   )r   r   z/INCREMENTAL:noz/DEBUGr   T)r
   r   rX   rc   find_execclinkerrj   rcmcPLAT_TO_VCVARSr   r   rS   r\   r   rR   Z_MSVCCompiler__productr    r   r[   r]   Zpreprocess_optionsr   compile_optionscompile_options_debugldflags_sharedr   ldflags_shared_debugZldflags_staticr   )r;   r   Zok_platsZ	plat_specZvc_envrC   r   r   r   
initializeS  sf   









zMSVCCompiler.initialize c                 C   s   |d u rd}g }|D ]b}t j|\}}t j|d }|t j|d  }|| jvr1td| |r9t j|}|| jv rL|	t j
||| j  q
|| jv r_|	t j
||| j  q
|	t j
||| j  q
|S )Nr   r   zDon't know how to compile %s)rX   r   splitext
splitdriveisabssrc_extensionsr   basename_rc_extensionsr    r]   res_extension_mc_extensionsobj_extension)r;   Zsource_filenamesZ	strip_dir
output_dirZ	obj_namesZsrc_namer   extr   r   r   object_filenames  s,   


zMSVCCompiler.object_filenamesc	                 C   s8  | j s|   | ||||||}	|	\}}
}}}|pg }|d |r*|| j n|| j |
D ]}z|| \}}W n	 tyE   Y q2w |rNtj	
|}|| jv rXd| }n|| jv rbd| }n|| jv r|}d| }z| | jg| |g |g  W n ty } zt|d }~ww q2|| jv rtj	|}tj	|}z6| | jgd|d|g |g  tj	tj	|\}}tj	||d }| | jgd| g |g  W n ty } zt|d }~ww q2td||f d	| }z| | jg| | ||g |  W q2 ty } zt|d }~ww |
S )
Nz/cz/Tcz/Tpz/foz-hz-rr   z"Don't know how to compile %s to %sz/Fo)r   r   Z_setup_compiler    extendr   r   r   rX   r   rf   _c_extensions_cpp_extensionsr   spawnr   r   r   r   dirnamer   r   r   r]   r   )r;   Zsourcesr   r7   Zinclude_dirsra   extra_preargsextra_postargsZdependsZcompile_infoobjectsZpp_optsZbuildZcompile_optsobjsrcr   Z	input_optZ
output_optmsgZh_dirZrc_dirr   r   Zrc_filer   r   r   compile  s   













zMSVCCompiler.compilec           	   
   C   s   | j s|   | ||\}}| j||d}| ||rC|d| g }|r&	 z| | jg|  W d S  tyB } zt|d }~ww t	
d| d S )N)r   /OUT:skipping %s (up-to-date))r   r   _fix_object_argslibrary_filename
_need_linkr   rj   r   r   r	   ra   )	r;   r   Zoutput_libnamer   ra   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|tjkrV|	rN| jdd  }n| jdd  }n	|	r\| j}n| j}g }|pdg D ]	}|d|  qe|| | | d| g }tj|d }|d urtjtj|\}}tj	|| |}|d|  | ||| |
r|
|d d< |r|| | tj| z| | jg|  W n ty } zt|d }~ww | ||}|d ur|\}}d||f }z| dd	d
||g W d S  ty } zt|d }~ww d S td| d S )Nz5I don't know what to do with 'runtime_library_dirs': r   z/EXPORT:r   r   z/IMPLIB:z-outputresource:%s;%szmt.exez-nologoz	-manifestr   )r   r   r   Z_fix_lib_argswarnry   r   rX   r   r]   r   r   
EXECUTABLEr   r   r    r   r   r   r   manifest_setup_ldargsr   Zmkpathr   r   r   r   manifest_get_embed_infor	   ra   )r;   target_descr   r   r   Z	librariesZlibrary_dirsZruntime_library_dirsZexport_symbolsra   r   r   
build_tempr   Z
fixed_argsZlib_optsZldflagsZexport_optsZsymld_argsZdll_nameZdll_extZimplib_filer   ZmfinfoZ
mffilenamemfidZout_argr   r   r   link5  s   






	zMSVCCompiler.linkc                 C   s,   t j|t j|d }|d|  d S )Nz	.manifest/MANIFESTFILE:)rX   r   r]   r   r    )r;   r   r   r   temp_manifestr   r   r   r     s
   z"MSVCCompiler.manifest_setup_ldargsc                 C   s^   |D ]}| dr|ddd } nqd S |tjkrd}nd}| |}|d u r+d S ||fS )Nr   :r   rN   )
startswithrS   r   r   _remove_visual_c_ref)r;   r   r   argr   r   r   r   r   r     s   


z$MSVCCompiler.manifest_get_embed_infoc                 C   s   zUt |}z
| }W |  n|  w tdtj}t|d|}d}t|d|}tdtj}t||d u r>W d S t |d}z|| |W |  W S |  w  t	y_   Y d S w )NzU<assemblyIdentity.*?name=("|')Microsoft\.VC\d{2}\.CRT("|').*?(/>|</assemblyIdentity>)r   z*<dependentAssembly>\s*</dependentAssembly>zI<assemblyIdentity.*?name=(?:"|')(.+?)(?:"|').*?(?:/>|</assemblyIdentity>)w)
openreadrw   rer   DOTALLrH   searchwriteOSError)r;   Zmanifest_fileZ
manifest_fZmanifest_bufpatternr   r   r   r     s4   	


z!MSVCCompiler._remove_visual_c_refc                 C   s   d| S )Nz	/LIBPATH:r   r;   dirr   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 r   )r   )r;   rj   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)rX   r   r]   r   exists)r;   dirsrj   ra   Z	try_namesr   r)   Zlibfiler   r   r   find_library_file  s   zMSVCCompiler.find_library_filec                 C   s|   	 | j D ]}tjtj||}tj|r|  S qtjd dD ]}tjtj||}tj|r;|  S q$|S )NPathr   )r   rX   r   r]   rf   rg   rc   rS   )r;   ZexerC   fnr   r   r   r      s   
zMSVCCompiler.find_exe)r   r   r   r   )r   r   )NNNr   NNN)Nr   N)
NNNNNr   NNNN)r   )r1   r2   r3   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   r   r   r   r   r   r   r   r   *  sd    

W
 
X

_+
r   )r   )/rX   rp   rP   r   Zdistutils.errorsr   r   r   r   r   Zdistutils.ccompilerr   r   Z	distutilsr	   Zdistutils.utilr
   winregZ	OpenKeyExr   ZEnumKeyr   Z	EnumValuer&   errorr   Z
HKEY_USERSHKEY_CURRENT_USERHKEY_LOCAL_MACHINEZHKEY_CLASSES_ROOTr   platformmaxsizeZNATIVE_WIN64r8   rB   rA   r   r   r6   rW   r[   r_   ri   r   r   r   r   r   r   r   <module>   sR    >.
#)