a
    %Rîhõv  ã                   @   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oªe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 r6e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                   @   sL   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   s:   t D ](}|  ||¡}|r||v r||   S qt|ƒ‚d S ©N)ÚHKEYSÚread_valuesÚKeyError)ÚclsÚpathÚkeyÚbaseÚd© r   ú?/opt/python-3.9.24/usr/lib/python3.9/distutils/msvc9compiler.pyÚ	get_value?   s
    zReg.get_valuec                 C   sj   zt ||ƒ}W n ty"   Y d S 0 g }d}zt||ƒ}W n tyP   Y qfY n0 | |¡ |d7 }q,|S ©Nr   é   )Ú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 0 i }d}zt||ƒ\}}}W n tyV   Y q~Y n0 | ¡ }|  |¡||  |¡< |d7 }q,|S 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   s8   t | dd ƒ}|d ur4z|dƒ} W n ty2   Y n0 | 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rP|   d	td
¡ ntd
ƒ‚W n tyt   tdƒ‚Y n0 |dkrž|   d| jd¡ |   dtd¡ n`d}tD ]V}zt||ƒ}W n tyÎ   Y q¦Y n0 t	|dƒ}t
 |d||f ¡}|d | jd< q¦d 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:   ƒ   s2    ÿÿ


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rf|d7 }t|dd	… ƒd
 }|dkr†d}|dkr–|| 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   s0   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0 |rNtj |¡sÄd|  }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| ¡ |sÖt 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Ù   s4    
ÿ



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rvt| 	d¡ƒ‚| 	d¡}| 
d¡D ]d}t |¡}d	|vr¢qŠ| ¡ }| 
d	d
¡\}	}
|	 ¡ }	|	|v rŠ|
 tj¡râ|
d d… }
t|
ƒ||	< qŠW |j ¡  |j ¡  n|j ¡  |j ¡  0 t|ƒt|ƒkrDttt| ¡ ƒƒƒ‚|S )N>   r   ÚlibZlibpathÚincluder`   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ü   sB    þ


ÿ
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 rfdtjv rf|  d¡rfd| _d| _d| _d| _d	| _	nÂ|t ƒ ksx|d
kr‚t
| }nt
t ƒ  d t
|  }tt|ƒ}|d  tj¡| _|d tjd< |d tjd< t| jƒdkrìtd| j ƒ‚|  d¡| _|  d¡| _|  d¡| _|  d¡| _|  d	¡| _	z(tjd  d¡D ]}| j |¡ q:W n tyd   Y n0 t| jƒ| _d | j¡tjd< d | _| jdkr¬g d¢| _g d¢| _ng d¢| _g d¢| _g d¢| _| jdkràg 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  sb    ÿ
ÿ
ý




zMSVCCompiler.initializeÚ c                 C   sÞ   |d u rd}g }|D ]Ä}t j |¡\}}t j |¡d }|t j |¡d … }|| jvrbtd| ƒ‚|rrt j |¡}|| jv r˜| 	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   st  | j s|  ¡  |  ||||||¡}	|	\}}
}}}|p6g }| d¡ |rT| | j¡ n| | j¡ |
D ]}z|| \}}W n ty   Y qdY n0 |r¢tj	 
|¡}|| jv r¸d| }nX|| jv rÎd| }nB|| jv r<|}d| }z"|  | jg| |g |g ¡ W qd ty6 } zt|ƒ‚W Y d }~qdd }~0 0 qdnÔ|| jv r tj	 |¡}tj	 |¡}zl|  | jgd|d|g |g ¡ tj	 tj	 |¡¡\}}tj	 ||d ¡}|  | jgd| g |g ¡ W qd tyú } zt|ƒ‚W Y d }~qdd }~0 0 qdntd||f ƒ‚d	| }z&|  | jg| | ||g | ¡ W qd tyl } zt|ƒ‚W Y d }~qdd }~0 0 qd|
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}|  ||¡r|d| g }|rJz|  | jg| ¡ W qœ tyŒ } zt|ƒ‚W Y d }~qœd }~0 0 n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   sX  | j s|  ¡  |  ||¡\}}|  |||¡}|\}}}|rL|  dt|ƒ ¡ t| |||ƒ}|d urptj 	||¡}|  
||¡rH|tjkr¬|	rœ| jdd … }q¾| jdd … }n|	r¸| j}n| j}g }|pÈg D ]}| d| ¡ qÊ|| | | d| g }tj |d ¡}|d urLtj tj |¡¡\}}tj 	||  |¡¡}| d| ¡ |  |||¡ |
rl|
|d d…< |r|| |¡ |  tj |¡¡ z|  | jg| ¡ W n. tyÒ } zt|ƒ‚W Y d }~n
d }~0 0 |  ||¡}|d urT|\}}d||f }z|  dd	d
||g¡ W n. tyD } 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': 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 } q,qd S |tjkr<d}nd}|  |¡}|d u rVd 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Æ   z®t |ƒ}z| ¡ }W | ¡  n
| ¡  0 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 | ¡  0 W n t	yÀ   Y n0 d S )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Ò   ¸  s6    	
ýþ

þ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ƒ‚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 r   )rÀ   )r;   rj   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)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   sz   | j D ].}tj tj |¡|¡}tj |¡r|  S qtjd  d¡D ].}tj tj |¡|¡}tj |¡rF|  S qF|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   )N)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€   *  s`   ÿÿ

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>   sN   ýþ>.#
)
