
    =Ogv                        	 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          Z& G d d          Z'd Z(d Z)d Z*d Z+ddZ, e(            Z-e-dk     r ede-z             G 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x86amd64r   z	win-amd64c                       e Zd Z	 d Z ee          Zd Z ee          Zd Z ee          Zd Z ee          ZdS )Regc                     t           D ](}|                     ||          }|r||v r
||         c S )t          |          N)HKEYSread_valuesKeyError)clspathkeybaseds        0/usr/lib64/python3.11/distutils/msvc9compiler.py	get_valuezReg.get_value?   sN     	 	Dd++A SAXXvsmm    c                     	 	 t          ||          }n# t          $ r Y d S w xY wg }d}	 	 t          ||          }n# t          $ r Y nw xY w|                    |           |dz  }=|S Nr   T   )RegOpenKeyExRegError
RegEnumKeyappend)r   r   r   handleLiks          r   	read_keyszReg.read_keysG   s    +	!$,,FF 	 	 	44		vq))   HHQKKKFA	 s    
""< 
A	A	c                 .   	 	 t          ||          }n# t          $ r Y d S w xY wi }d}	 	 t          ||          \  }}}n# t          $ r Y nIw xY w|                                }|                     |          ||                     |          <   |dz  }k|S r    )r"   r#   RegEnumValuelowerconvert_mbcs)	r   r   r   r&   r   r(   namevaluetypes	            r   r   zReg.read_valuesY   s    		!$,,FF 	 	 	44		$0$;$;!eTT   ::<<D(+(8(8(?(?Act$$%FA	 s    
""A   
AAc                 f    t          | dd           }|	  |d          } n# t          $ r Y nw xY w| S )Ndecodembcs)getattrUnicodeError)sdecs     r   r.   zReg.convert_mbcso   sQ    a4((?CKK   s   ! 
..N)	__name__
__module____qualname__r   classmethodr*   r   r.   staticmethod r   r   r   r   ;   s           I&&I    I&&I  ( +k**K    <--LLLr   r   c                   &    e Zd Zd Zd Zd Zd ZdS )MacroExpanderc                 \    i | _         t          |z  | _        |                     |           d S r   )macrosVS_BASEvsbaseload_macros)selfversions     r   __init__zMacroExpander.__init__{   s/    '!!!!!r   c                 R    t                               ||          | j        d|z  <   d S )Nz$(%s))r   r   rB   )rF   macror   r   s       r   	set_macrozMacroExpander.set_macro   s&    '*}}T3'?'?GeO$$$r   c                    |                      d| j        dz   d           |                      d| j        dz   d           |                      dt          d           	 |dk    r|                      d	t          d
           nt          d
          n# t          $ r t	          d          w xY w|dk    r:|                      d| j        d           |                      dt
          d           d S d}t          D ]d}	 t          ||          }n# t          $ r Y  w xY wt          |d          }t                              ||d|          }|d         | j        d<   ed S )NVCInstallDirz	\Setup\VC
productdirVSInstallDirz	\Setup\VSFrameworkDirinstallroot       @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      "@FrameworkVersionzclr versionWindowsSdkDircurrentinstallfolderz.Software\Microsoft\NET Framework Setup\Productr   \rG   z$(FrameworkVersion))rK   rD   NET_BASEr   r   WINSDK_BASEr   r"   r#   r$   r   r   rB   )rF   rG   pr   hr   r   s          r   rE   zMacroExpander.load_macros   s   ~t{\'A<PPP~t{\'A<PPP~x???	M#~~0(35 5 5 5 34445  	M 	M 	M(LM M M	M c>>NN-t{MJJJNN?K9OPPPPPAA B B$T1--AA   H A&&MM$AAAss(;<<56y\122B Bs   2B B)8D		
DDc                 p    | j                                         D ]\  }}|                    ||          }|S r   )rB   itemsreplace)rF   r7   r)   vs       r   subzMacroExpander.sub   s;    K%%'' 	  	 DAq		!QAAr   N)r9   r:   r;   rH   rK   rE   r`   r>   r   r   r@   r@   y   sV        " " "
@ @ @B B B>    r   r@   c                  x   	 d} t           j                            |           }|dk    rdS |t          |           z   }t           j        |d                              dd          \  }}t          |d d                   dz
  }|dk    r|dz  }t          |dd	                   d
z  }|dk    rd}|dk    r||z   S d S )NzMSC v.    r!            g      $@r   )sysrG   findlensplitint)prefixr(   r7   restmajorVersionminorVersions         r   get_build_versionrr      s    
 F  ABwwq	CKKAk!""o##C++GAtq"v;;?Lrq1v;;%Lqql**4r   c                     	 g }| D ]:}t           j                            |          }||vr|                    |           ;|S r   )osr   normpathr%   )pathsreduced_pathsrZ   nps       r   normalize_and_reduce_pathsry      sX    
 M % %Wa  ]""  $$$r   c                     	 |                      t          j                  }g }|D ]}||vr|                    |           t          j                            |          }|S r   )rl   rt   pathsepr%   join)variableoldListnewListr(   newVariables        r   removeDuplicatesr      se    nnRZ((GG  GNN1*//'**Kr   c                    	 t           | z  }	 t                              d|z  d          }n&# t          $ r t	          j        d           d }Y nw xY w|rt          j                            |          sd| z  }t          j	        
                    |d           }|rt          j                            |          rt          j                            |t          j        t          j        d          }t          j                            |          }t          j                            |          st	          j        d|z             d S nt	          j        d|z             |st	          j        d           d S t          j                            |d	          }t          j                            |          r|S t	          j        d
           d S )Nz%s\Setup\VCrN   z%Unable to find productdir in registryzVS%0.f0COMNTOOLS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)rC   r   r   r   r
   debugrt   r   isdirenvirongetr|   pardirabspathisfile)rG   rD   rN   toolskeytoolsdir	vcvarsalls         r   find_vcvarsallr      s   
 wF]]>F#:#/1 1

   	9:::


  ERW]]:66 E%/:>>(D11 	Eh// 	Eh	29dKKJ44J7==,, 	7*DEEEt I88CDDD 	'(((tZ99I	w~~i   I,---4s   ,  AAc                    	 t          |           }h d}i }|t          d          t          j        d||            t	          j        d|d|dt          j        t          j                  }	 |                                \  }}|                                dk    r"t          |	                    d	                    |	                    d	          }|
                    d
          D ]}t                              |          }d|vr!|                                }|
                    dd          \  }	}
|	                                }	|	|v r;|
                    t           j                  r
|
d d         }
t%          |
          ||	<   	 |j                                         |j                                         n7# |j                                         |j                                         w xY wt-          |          t-          |          k    r;t/          t1          t3          |                                                              |S )N>   libr   includelibpathr   z'Calling 'vcvarsall.bat %s' (version=%s)"z" z & set)stdoutstderrr   r4   
=r!   rb   )r   r   r
   r   
subprocessPopenPIPEcommunicatewaitr3   rl   r   r.   stripr-   endswithrt   r{   r   r   closer   rk   
ValueErrorstrlistkeys)rG   archr   interestingresultpopenr   r   liner   r0   s              r   query_vcvarsallr      s+   w''I777KF$%CDDDI7wGGG			444@$.O$.O5 5 5E**,,::<<1(v)>)>???v&&LL&& 
	6 
	6D##D))D$::<<DC++JC))++Ck!!>>"*-- '!#2#JE.u55s
	6 	 	
6{{c+&&&&T&++--0011222Ms   1DG 4G6rR   z(VC %0.1f is not supported by this modulec                       e Zd Z	 dZi ZdgZg dZdgZdgZeez   ez   ez   Z	dZ
dZdZd	Zd
xZZdZddZddZ	 	 ddZ	 	 d dZ	 	 	 d!dZ	 	 	 	 	 	 	 	 	 	 d"dZd Zd Zd Zd Zd Zd Zd#dZd ZdS )$MSVCCompilermsvcz.c)z.ccz.cppz.cxx.rcz.mcz.resz.objz.libz.dllz%s%sz.exer   c                     t          j        | |||           t          | _        d| _        g | _        d | _        d | _        d| _        d S )NzSoftware\Microsoft\VisualStudioF)	r   rH   VERSION_MSVCCompiler__version_MSVCCompiler__root_MSVCCompiler__paths	plat_name_MSVCCompiler__archinitialized)rF   verbosedry_runforces       r   rH   zMSVCCompiler.__init__H  sJ    D'7E::: 8 r   Nc                    |t                      }d}||vrt          d|          dt          j        v rHdt          j        v r:|                     d          r%d| _        d| _        d| _        d| _        d	| _	        nj|t                      k    s|d
k    rt          |         }n*t          t                               dz   t          |         z   }t          t          |          }|d                             t          j                  | _        |d         t          j        d<   |d         t          j        d<   t!          | j                  dk    rt          d| j        z            |                     d          | _        |                     d          | _        |                     d          | _        |                     d          | _        |                     d	          | _	        	 t          j        d                             d          D ]}| j                            |           n# t&          $ r Y nw xY w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 DISTUTILS_USE_SDKMSSdkzcl.exezlink.exezlib.exezrc.exezmc.exer   _r   r   r   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   rt   r   find_execclinkerr   rcmcPLAT_TO_VCVARSr   r   rl   r{   r   rk   _MSVCCompiler__productr%   r   ry   r|   preprocess_optionsr   compile_optionscompile_options_debugldflags_sharedr   ldflags_shared_debugldflags_staticr   )rF   r   ok_plats	plat_specvc_envrZ   s         r   
initializezMSVCCompiler.initializeS  s    $I'H$$((*2(*5 6 6 6 "*,,BJ1F1F4==YaKbKb1F DG$DK DHDGDGG LNN**i7.B.B*95		 +<>>:S@*956	 %Wi88F!&>//
;;DL &uBJu$*9$5BJy!4<  A%%, .J .( ) ) )
 mmH--DG--
33DK}}Y//DHmmH--DGmmH--DG
	Z'--c22 ' '##A&&&&' 	 	 	D	1$,?? XXdl33
6"&;%$1 $1 $1D *= *= *=D&&$1 $1 $1D *= *= *=D& EDD>Q) ) )D% !*ls   *AH- -
H:9H: c                     |d}g }|D ]s}t           j                            |          \  }}t           j                            |          d         }|t           j                            |          d          }|| j        vrt          d|z            |rt           j                            |          }|| j        v r<|	                    t           j        
                    ||| j        z                        || j        v r=|	                    t           j        
                    ||| j        z                        8|	                    t           j        
                    ||| j        z                        u|S )Nr   r!   zDon't know how to compile %s)rt   r   splitext
splitdriveisabssrc_extensionsr   basename_rc_extensionsr%   r|   res_extension_mc_extensionsobj_extension)rF   source_filenames	strip_dir
output_dir	obj_namessrc_namer   exts           r   object_filenameszMSVCCompiler.object_filenames  s    Bz	( 	L 	LH'**H55KT37%%d++A.Dd++,,-D$--- #$BX$MNNN /w''..d)))  "',,
04t7I0I#K #K L L L L+++  "',,
04t7I0I#K #K L L L L   "',,
04t7I0I#K #K L L L Lr   c	                    | j         s|                                  |                     ||||||          }	|	\  }}
}}}|pg }|                    d           |r|                    | j                   n|                    | j                   |
D ];}	 ||         \  }}n# t          $ r Y w xY w|rt          j	        
                    |          }|| j        v rd|z   }n|| j        v rd|z   }n|| j        v rQ|}d|z   }	 |                     | j        g|z   |gz   |gz              n!# t           $ r}t#          |          d }~ww xY w|| j        v rt          j	                            |          }t          j	                            |          }	 |                     | j        gd|d|gz   |gz              t          j	                            t          j	                            |                    \  }}t          j	                            ||dz             }|                     | j        gd|z   gz   |gz              n!# t           $ r}t#          |          d }~ww xY wt#          d|d	|          d
|z   }	 |                     | j        g|z   |z   ||gz   |z              # t           $ r}t#          |          d }~ww xY w|
S )Nz/cz/Tcz/Tpz/foz-hz-rr   zDon't know how to compile z to z/Fo)r   r   _setup_compiler%   extendr   r   r   rt   r   r   _c_extensions_cpp_extensionsr   spawnr   r   r   r   dirnamer   r   r   r|   r   )rF   sourcesr   rB   include_dirsr   extra_preargsextra_postargsdependscompile_infoobjectspp_optsbuildcompile_optsobjsrcr   	input_opt
output_optmsgh_dirrc_dirr   r   rc_files                            r   compilezMSVCCompiler.compile  s     	OO**:v|+2G^M M:F7%$*T""" 	6 :;;;; 4555 ?	( ?	(C :SS    + gooc**d(((!CK		,,,!CK		+++	"S[
,JJy72 *| ,/8k : ; ; ; ;) , , ,&s+++,+++ ,,--,JJy $eT6: ;>AU C D D D g..0@0@#0F0FGGGD! gllFD5LAAGJJy %} -07y 9 : : : : * , , ,&s+++, #l&)cc33$0 1 1 1 J(

DG9|3g=%z23)* + + + + & ( ( ("3'''( s[   B  
B-,B-&D))
E3EEB.I
I!II!)J,,
K
6KK
c                    | j         s|                                  |                     ||          \  }}|                     ||          }|                     ||          rN|d|z   gz   }|r	 	 |                     | j        g|z              d S # t          $ r}t          |          d }~ww xY wt          j
        d|           d S )N)r   /OUT:skipping %s (up-to-date))r   r   _fix_object_argslibrary_filename
_need_linkr   r   r   r   r
   r   )	rF   r   output_libnamer   r   target_langoutput_filenamelib_argsr  s	            r   create_static_libzMSVCCompiler.create_static_lib  s      	OO $ 5 5gz J J*//;E 0 G G ??7O44 		C'O";!<<H $

DH:011111% $ $ $smm#$ I0/BBBBBs   /B 
B-B((B-c                 "   | j         s|                                  |                     ||          \  }}|                     |||          }|\  }}}|r%|                     dt          |          z              t          | |||          }| t          j        	                    ||          }| 
                    ||          r6|t          j        k    r"|	r| j        dd          }n!| j        dd          }n|	r| j        }n| j        }g }|pg D ]}|                    d|z              ||z   |z   |z   d|z   gz   }t          j                            |d                   }|t          j                            t          j                            |                    \  }}t          j        	                    ||                     |                    }|                    d|z              |                     |||           |
r|
|d d<   |r|                    |           |                     t          j                            |                     	 |                     | j        g|z              n!# t2          $ r}t5          |          d }~ww xY w|                     ||          }|K|\  }}d|d|}	 |                     d	d
d||g           d S # t2          $ r}t5          |          d }~ww xY wd S t9          j        d|           d S )Nz5I don't know what to do with 'runtime_library_dirs': r!   z/EXPORT:r	  r   z/IMPLIB:z-outputresource:r   zmt.exez-nologoz	-manifestr
  )r   r   r  _fix_lib_argswarnr   r	   rt   r   r|   r  r   
EXECUTABLEr   r   r%   r   r   r   r  manifest_setup_ldargsr   mkpathr   r   r   r   manifest_get_embed_infor
   r   )rF   target_descr   r  r   	librarieslibrary_dirsruntime_library_dirsexport_symbolsr   r   r   
build_tempr  
fixed_argslib_optsldflagsexport_optssymld_argsdll_namedll_extimplib_filer  mfinfo
mffilenamemfidout_args                               r   linkzMSVCCompiler.link5  s     	OO $ 5 5gz J J*''	<(<> >
:D7L"6 	5IIN2334 5 5 5 #4#/1E#,. . ! gll:GGO??7O44 =	Ci222 6"7;GG"1!""5GG 2"7GG"1GK&," 5 5"":#34444)K7")O";!<=G 44J)&(g&6&6G$$_55'7 '7#7 gll))(335 5 
[ 8999&&
GLLL ,+ /~...KK88999%

DK=723333% % % %nn$% 11+wGGF!#) 
DD5D__ddK)JJ)[ *G 5 6 6 6 6 6) ) ) )#C..() "! I0/BBBBBs0   I4 4
J>JJ;K 
K5!K00K5c                     t           j                            |t           j                            |          dz             }|                    d|z              d S )Nz	.manifest/MANIFESTFILE:)rt   r   r|   r   r%   )rF   r  r  r%  temp_manifests        r   r  z"MSVCCompiler.manifest_setup_ldargs  sV       11K?A A 	'-788888r   c                     |D ]5}|                     d          r|                    dd          d         } n6d S |t          j        k    rd}nd}|                     |          }|d S ||fS )Nr/  :r!   rg   )
startswithrl   r   r  _remove_visual_c_ref)rF   r  r%  argr0  r+  s         r   r  z$MSVCCompiler.manifest_get_embed_info  s    
  	 	C~~.//  #		#q 1 1! 4
 4)... DD D 55mDDM 4d""r   c                 z   	 t          |          }	 |                                }|                                 n# |                                 w xY wt          j        dt          j                  }t          j        |d|          }d}t          j        |d|          }t          j        dt          j                  }t          j        ||          d S t          |d          }	 |                    |           ||                                 S # |                                 w xY w# t          $ r Y d S w xY w)NzU<assemblyIdentity.*?name=("|')Microsoft\.VC\d{2}\.CRT("|').*?(/>|</assemblyIdentity>)r   z*<dependentAssembly>\s*</dependentAssembly>zI<assemblyIdentity.*?name=(?:"|')(.+?)(?:"|').*?(?:/>|</assemblyIdentity>)w)
openreadr   rer  DOTALLr`   searchwriteOSError)rF   manifest_file
manifest_fmanifest_bufpatterns        r   r4  z!MSVCCompiler._remove_visual_c_ref  sR   $	 m,,J#)00  """"
  """"jD	 G 6'2|<<LCG6'2|<<L j568iA AG y,//7tmS11J#  ...$  """"
  """" 	 	 	DD	sD   D, ; D, ABD, D, (D >D, D))D, ,
D:9D:c                     d|z   S )Nz	/LIBPATH:r>   rF   dirs     r   library_dir_optionzMSVCCompiler.library_dir_option  s    S  r   c                      t          d          )Nz<don't know how to set runtime library search path for MSVC++)r   rD  s     r   runtime_library_dir_optionz'MSVCCompiler.runtime_library_dir_option  s    $LN N 	Nr   c                 ,    |                      |          S r   )r  )rF   r   s     r   library_optionzMSVCCompiler.library_option  s    $$S)))r   c                     |r|dz   |g}n|g}|D ]_}|D ]Z}t           j                            ||                     |                    }t           j                            |          r|c c S [`d S )N_d)rt   r   r|   r  exists)rF   dirsr   r   	try_namesrE  r/   libfiles           r   find_library_filezMSVCCompiler.find_library_file  s      	tS)III 	 	C! # #',,sD,A,A4,H,HII7>>'** #"NNNNN## 4r   c                    	 | j         D ]b}t          j                            t          j                            |          |          }t          j                            |          r|c S ct          j        d                             d          D ]b}t          j                            t          j                            |          |          }t          j                            |          r|c S c|S )NPathr   )r   rt   r   r|   r   r   r   rl   )rF   exerZ   fns       r   r   zMSVCCompiler.find_exe   s    	  	 	Abgooa00#66Bw~~b!! 			 F#))#.. 	 	Abgooa0055Bw~~b!! 			 
r   )r   r   r   r   )r   r   )NNNr   NNN)Nr   N)
NNNNNr   NNNN)r   )r9   r:   r;   compiler_typeexecutablesr   r   r   r   r   r   r   static_lib_extensionshared_lib_extensionstatic_lib_formatshared_lib_formatexe_extensionrH   r   r   r  r  r-  r  r  r4  rF  rH  rJ  rQ  r   r>   r   r   r   r   *  s       6 M K FM---OWNWN $o5$%'56NMM!!,22)M	! 	! 	! 	!Q  Q  Q  Q n $%$&   @ HIAER R R Rp &* !&*C C C C: "&  ]C ]C ]C ]C~
9 
9 
9# # #0% % %V! ! !N N N* * *   $    r   r   )r   )/rt   r   ri   r:  distutils.errorsr   r   r   r   r   distutils.ccompilerr   r	   	distutilsr
   distutils.utilr   winreg	OpenKeyExr"   EnumKeyr$   	EnumValuer,   errorr#   
HKEY_USERSHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_CLASSES_ROOTr   platformmaxsizeNATIVE_WIN64rC   rY   rX   r   r   r@   rr   ry   r   r   r   r   r   r>   r   r   <module>rm     sf   
			     



 				? ? ? ? ? ? ? ? ? ? ? ? ? ? : : : : : : : :       ' ' ' ' ' ' ^
<				!		"		!	#
 '?CK%,? 
3 CGJK>HH6G>K2H  
<. <. <. <. <. <. <. <.|, , , , , , , ,\  2  	 	 	! ! !F& & & &R 



S==
 
 !Kg!U
V
VVj j j j j9 j j j j jr   