o
    ðT·j‡V  ã                   @   sæ  d Z ddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
ZddlmZ zddlmZ W n ey?   dd„ ZY nw ddlmZ dd	lmZmZmZmZ d
d„ Ze d¡Ze d¡ZG dd„ dejjƒZdd„ Z dd„ Z!dd„ Z"dd„ Z#d<dd„Z$dd„ Z%dd„ Z&dd „ Z'd!d"„ Z(i Z)ej*d#krÔz/ddl+Z+d$e)d%< d&e)d'< d(e)d)< e,e+d*dƒZ-e-durÃe .d+e-¡ /¡ \Z0Z1e-e)e0e1 < [0[1[-W n eyÓ   e	 2d,¡ Y nw d-d.„ Z3d=d0d1„Z4d2d3„ Z5d4d5„ Z6d6d7„ Z7d8d9„ Z8d:d;„ Z9dS )>a  
Support code for building Python extensions on Windows.

    # NT stuff
    # 1. Make sure libpython<version>.a exists for gcc.  If not, build it.
    # 2. Force windows to use gcc (we're struggling with MSVC and g77 support)
    # 3. Force windows to use g77

é    N)Úlog)ÚUnixCCompiler)Úget_build_versionc                   C   s   d S ©N© r   r   r   úc/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/numpy/distutils/mingw32ccompiler.pyÚget_build_msvc_version   s   r   )ÚUnknownFileError)Úmsvc_runtime_libraryÚmsvc_runtime_versionÚmsvc_runtime_majorÚget_build_architecturec                  C   s   t ƒ } | du r	g S | gS )zBReplacement for outdated version of get_msvcr from cygwinccompilerN)r
   )Úmsvcrr   r   r   Úget_msvcr_replacement(   s   r   z\[Ordinal/Name Pointer\] Tablez$^\s+\[([\s*[0-9]*)\] ([a-zA-Z0-9_]*)c                   @   sH   e Zd ZdZdZ			ddd„Z						ddd„Z			dd
d„ZdS )ÚMingw32CCompilerzH A modified MingW32 compiler compatible with an MSVC built Python.

    Úmingw32r   c                 C   s’   t jj | |||¡ tƒ  tƒ }tdd�}|s|r|  d¡ tƒ }|r+|  dd| ¡ tƒ dkr:| j	ddd	d
d� n	| j	ddddd� dg| _
d S )NT)ÚdebugÚNPY_MINGW_USE_CUSTOM_MSVCRÚ__MSVCRT_VERSION__z0x%04iÚAMD64z#gcc -g -DDEBUG -DMS_WIN64 -O0 -Wallz7gcc -g -DDEBUG -DMS_WIN64 -O0 -Wall -Wstrict-prototypeszgcc -gzgcc -g -shared)ÚcompilerÚcompiler_soÚ
linker_exeÚ	linker_sozgcc -O2 -Wallz!gcc -O2 -Wall -Wstrict-prototypeszg++ zg++ -sharedzg++)Ú	distutilsÚcygwinccompilerÚCygwinCCompilerÚ__init__Úbuild_import_libraryÚbuild_msvcr_libraryÚdefine_macror   r   Úset_executablesÚcompiler_cxx)ÚselfÚverboseÚdry_runÚforceÚmsvcr_successÚmsvcr_dbg_successÚmsvcr_versionr   r   r   r   :   s4   ÿ


ûüzMingw32CCompiler.__init__Nc                 C   sZ   t ƒ }|r|s	g }| |¡ | |||||||d |	|
|||f}tj}||d |jj… Ž  d S r   )r
   Úappendr   ÚlinkÚ__code__Úco_argcount)r#   Útarget_descÚobjectsÚoutput_filenameÚ
output_dirÚ	librariesÚlibrary_dirsÚruntime_library_dirsÚexport_symbolsr   Úextra_preargsÚextra_postargsÚ
build_tempÚtarget_langÚruntime_libraryÚargsÚfuncr   r   r   r+   r   s.   
ózMingw32CCompiler.linkÚ c           	      C   sÒ   |d u rd}g }|D ]\}t j t j |¡¡\}}t j |¡\}}|r(|dd … }|| jddg vr9td||f ƒ‚|rAt j |¡}|dksI|dkrY| t j 	||| | j
 ¡¡ q
| t j 	||| j
 ¡¡ q
|S )Nr=   é   ú.rcz.resz"unknown file type '%s' (from '%s'))ÚosÚpathÚsplitextÚnormcaseÚ
splitdriveÚsrc_extensionsr	   Úbasenamer*   ÚjoinÚobj_extension)	r#   Úsource_filenamesÚ	strip_dirr1   Ú	obj_namesÚsrc_nameÚbaseÚextÚdrvr   r   r   Úobject_filenames™   s.   ÿÿÿÿz!Mingw32CCompiler.object_filenames)r   r   r   )Nr   NNNN)r   r=   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úcompiler_typer   r+   rP   r   r   r   r   r   3   s"    
ý@
ó)ýr   c            
      C   s  t jg} t jt jkr|  t j¡ g d¢}g }| D ]}|D ]}| tj ||¡¡ qqdtjv r<| tj tjd d¡¡ tt j	d d… ƒ\}}t j
j}|dkrXd|› |› d�}n|dkrfd	|› d
|› d�}nd|› �}td| ƒ |D ]}tj ||¡}	tj |	¡r†|	  S qstd||f ƒ‚)N)r=   ÚlibÚbinÚ
SYSTEMROOTÚSystem32é   ÚcpythonÚpythonú.dllÚpypyÚlibpypyÚ.z-c.dllzUnknown platform zLooking for %sz%s not found in %s)ÚsysÚprefixÚbase_prefixr*   r@   rA   rG   ÚenvironÚtupleÚversion_infoÚimplementationÚnameÚprintÚexistsÚ
ValueError)
ÚstemsÚsub_dirsÚlib_dirsÚstemÚfolderÚmajor_versionÚminor_versionrg   ÚdllnameÚdllr   r   r   Úfind_python_dll¼   s2   ÿ

ÿru   c                 C   s   t  dd| g¡}| d¡S )Nzobjdump.exez-pó   
)Ú
subprocessÚcheck_outputÚsplit)rt   Ústr   r   r   Ú
dump_tableâ   s   
r{   c           	      C   s(  t | ƒ}tt|ƒƒD ]}t ||  ¡ ¡r nq
tdƒ‚g }t|d t|ƒƒD ]}t ||  ¡ ¡}|rF| t	| 
d¡ ¡ ƒ| 
d¡f¡ q' t|ƒdkrTt d|  ¡ t|dƒ�1}| dtj | ¡ ¡ | d¡ | d	¡ | d
¡ |D ]}| d|d  ¡ qvW d  ƒ dS 1 s�w   Y  dS )zŠGiven a dll file location,  get all its exported symbols and dump them
    into the given def file.

    The .def file will be overwrittenzSymbol table not foundr>   rZ   r   zNo symbols found in %sÚwzLIBRARY        %s
z,;CODE          PRELOAD MOVEABLE DISCARDABLE
z;DATA          PRELOAD SINGLE
z	
EXPORTS
z%s
N)r{   ÚrangeÚlenÚ_STARTÚmatchÚdecoderk   Ú_TABLEr*   ÚintÚgroupÚstripr   ÚwarnÚopenÚwriter@   rA   rF   )	rt   ÚdfileÚdumpÚiÚsymsÚjÚmÚdÚsr   r   r   Úgenerate_defæ   s.   ÿ$


þ"ûr‘   c                    s4   dddœt ƒ  ‰ ‡ fdd„}dd„ }|| ƒp|| ƒS )NÚamd64Úx86)r   ÚIntelc                    sd   t j t j dd¡d¡}t j |¡sd S t  |¡D ]\}}}| |v r/ˆ |v r/t j || ¡  S qd S )NÚWINDIRz
C:\WINDOWSÚwinsxs)r@   rA   rG   rd   Úgetrj   Úwalk)Údll_nameÚwinsxs_pathÚrootÚdirsÚfiles©Úarchr   r   Ú_find_dll_in_winsxs  s   ÿ€z%find_dll.<locals>._find_dll_in_winsxsc                 S   sL   t jgtjd  d¡ D ]}tj || ¡}tj |¡r#tj |¡  S qd S )NÚPATHú;)	ra   rb   r@   rd   ry   rA   rG   rj   Úabspath)r™   rA   Úfilepathr   r   r   Ú_find_dll_in_path  s   ÿþz#find_dll.<locals>._find_dll_in_path)r   )r™   r    r¥   r   rž   r   Úfind_dll  s   ÿÿr¦   Fc                 C   s  t jdkrdS tƒ }|d u rt d¡ dS |dk r t d¡ dS tƒ }| r)|d7 }d| }t j tj	d|¡}t j 
|¡rFt d	|f ¡ d
S |d }t|ƒ}|sYt d| ¡ dS d| }t j tj	d|¡}t d||f ¡ t||ƒ dd|d|g}	t |	¡}
t  |¡ |
 S )NÚntFz?Skip building import library: Runtime is not compiled with MSVCéP   z=Skip building msvcr library: custom functionality not presentr�   zlib%s.aÚlibsz(Skip building msvcr library: "%s" existsTr]   z*Cannot build msvcr library: "%s" not foundz	lib%s.defz&Building msvcr library: "%s" (from %s)Údlltoolú-dú-l)r@   rh   r   r   r   r
   rA   rG   ra   rb   Úisfiler¦   r†   Úinfor‘   rw   ÚcallÚremove)r   Ú	msvcr_verÚ
msvcr_nameÚout_nameÚout_fileÚmsvcr_dll_nameÚdll_fileÚdef_nameÚdef_fileÚcmdÚretcoder   r   r   r      sH   


ÿÿÿ


r   c                  C   s<   t jdkrd S tƒ } | dkrtƒ S | dkrtƒ S td|  ƒ‚)Nr§   r   r”   zUnhandled arch %s)r@   rh   r   Ú_build_import_library_amd64Ú_build_import_library_x86rk   rž   r   r   r   r   [  s   
r   c               
   C   sæ   t tjdd… ƒ\} }g d¢}tjg}ttdƒr%tjtjkr%| tj¡ nttdƒr6tjtjkr6| tj¡ ddg}g }|D ]}|| |f }|D ]}|D ]}	| tj	 
||	|¡¡ qLqHq>|D ]}
tj	 |
¡rld|
f  S q^d	|d
 fS )zACheck if an import library for the Python runtime already exists.NrZ   )zlibpython%d%d.azlibpython%d%d.dll.azlibpython%d.%d.dll.arc   Úreal_prefixr©   rV   TFr   )re   ra   rf   rb   Úhasattrrc   r*   r½   r@   rA   rG   r­   )rq   rr   Úpatternsrl   rm   Ú
candidatesÚpatÚfilenameÚstem_dirrp   Úfullnamer   r   r   Ú_check_for_import_libg  s*   ÿÿþrÅ   c                  C   s„   t ƒ \} }| rt d|¡ d S tƒ }t d||f ¡ dttjd d… ƒ }tj	 
tjd|¡}t||ƒ dd|d|g}t |¡ d S )	Nú)Skip building import library: "%s" existsz4Building import library (arch=AMD64): "%s" (from %s)úpython%d%d.defrZ   r©   rª   r«   r¬   )rÅ   r   r   ru   r®   re   ra   rf   r@   rA   rG   rb   r‘   rw   Ú
check_call)Ú
out_existsr´   r¶   r·   r¸   r¹   r   r   r   r»   ‹  s   
ÿ
r»   c                  C   sˆ  t ƒ \} }| rt d|¡ dS dttjdd… ƒ }tj tj	d|¡}tj 
|¡sZttdƒr8tj tjd|¡}nttdƒrGtj tjd|¡}nd}tj 
|¡rR|}nt d	|¡ dS t d
|¡ ddlm} dttjdd… ƒ }tj tj	d|¡}|j|j|g dd�}| |¡\}	}
t|dƒ�}| |	|
|j|¡ W d  ƒ n1 s¥w   Y  tƒ }dd|d|d|g}t |¡}|rÂt d¡ dS )z; Build the import libraries for Mingw32-gcc on Windows
    rÆ   Nzpython%d%d.librZ   r©   rc   r½   r=   z+Cannot build import library: "%s" not foundz(Building import library (ARCH=x86): "%s"r   )Úlib2defrÇ   F)Úshellr|   rª   z	--dllnamez--defz--output-libz:Failed to build import library for gcc. Linking will fail.)rÅ   r   r   re   ra   rf   r@   rA   rG   rb   r­   r¾   rc   r½   r†   r®   Únumpy.distutilsrÊ   ÚgetnmÚ
DEFAULT_NMÚparse_nmr‡   Ú
output_defÚ
DEF_HEADERru   rw   rx   )rÉ   r´   Úlib_nameÚlib_fileÚbase_librÊ   r·   r¸   Ú	nm_outputÚdlistÚflistÚfidr™   r¹   Ústatusr   r   r   r¼   Ÿ  sJ   


ÿÿý

r¼   Úwin32z8.0.50727.42Ú80z9.0.21022.8Ú90z10.0.30319.460Ú100ÚCRT_ASSEMBLY_VERSIONz(\d+)\.(\d)z9Cannot import msvcrt: using manifest will not be possiblec                 C   sT   zt t| d | ƒ }W n ty   td| |f ƒd‚w t d¡}||| |dœ S )zUGiven a major and minor version of the MSVCR, returns the
    corresponding XML file.é
   z)Version %d,%d of MSVCRT not supported yetNaÃ          <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
          <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
            <security>
              <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
              </requestedPrivileges>
            </security>
          </trustInfo>
          <dependency>
            <dependentAssembly>
              <assemblyIdentity type="win32" name="Microsoft.VC%(maj)d%(min)d.CRT" version="%(fullver)s" processorArchitecture="*" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
            </dependentAssembly>
          </dependency>
        </assembly>)ÚfullverÚmajÚmin)Ú_MSVCRVER_TO_FULLVERÚstrÚKeyErrorrk   ÚtextwrapÚdedent)rá   râ   rà   Útemplater   r   r   Úmsvc_manifest_xmlø  s   ÿÿÿ
	ré   rt   c                 C   s4   |dkrd}n|dkrd}nt d| ƒ‚d|| f S )aW  Return the rc file used to generate the res file which will be embedded
    as manifest for given manifest file name, of given type ('dll' or
    'exe').

    Parameters
    ----------
    name : str
            name of the manifest file to embed
    type : str {'dll', 'exe'}
            type of the binary which will embed the manifest

    rt   rZ   Úexer>   zType %s not supportedz&#include "winuser.h"
%d RT_MANIFEST %s)rk   )rh   ÚtypeÚrctyper   r   r   Úmanifest_rc  s   þrí   c                 C   s2   t ƒ }|r|t| ƒkstdt| ƒ|f ƒ‚dS dS )z6msver is the ms runtime version used for the MANIFEST.zKDiscrepancy between linked msvcr (%d) and the one about to be embedded (%d)N)r   rƒ   rk   )Úmsverrá   r   r   r   Ú!check_embedded_msvcr_match_linked0  s   
þÿþrï   c                 C   s&   t j |  dg d¡¡}t j |¡d S )NÚyoÚcr   )r@   rA   rF   Ú_gen_temp_sourcefilerB   )ÚconfigrM   r   r   r   Úconfigtest_name<  s   rô   c                 C   s   t | ƒ}| jj}|| d S )Nz	.manifest)rô   r   Úexe_extension)ró   r›   Úexextr   r   r   Úmanifest_name@  s   r÷   c                 C   s   t | ƒ}|d S )Nr?   )rô   )ró   r›   r   r   r   Úrc_nameF  s   rø   c                 C   s˜   t ƒ }|d urH|dkrJt|ƒ t|ƒ d¡\}}tt|ƒt|ƒƒ}tt| ƒdƒ�}| j 	t| ƒ¡ | 
|¡ W d   ƒ d S 1 sAw   Y  d S d S d S )Né   r`   r|   )r   rï   rä   ry   ré   rƒ   r‡   r÷   Ú
temp_filesr*   rˆ   )ró   rî   Úma_strÚmi_strÚmanxmlÚmanr   r   r   Úgenerate_manifestK  s   "þúrÿ   )F)rt   ):rT   r@   ra   rw   Úreræ   Únumpy.distutils.ccompilerÚnumpyrÌ   r   Údistutils.cygwinccompilerr   Údistutils.unixccompilerr   Údistutils.msvccompilerr   r   ÚImportErrorÚdistutils.errorsr	   Únumpy.distutils.misc_utilr
   r   r   r   r   Úcompiler   r‚   r   r   r   ru   r{   r‘   r¦   r   r   rÅ   r»   r¼   rã   ÚplatformÚmsvcrtÚgetattrÚcrt_verr€   Úgroupsrá   râ   r†   ré   rí   rï   rô   r÷   rø   rÿ   r   r   r   r   Ú<module>   sl    	ÿ

 
& 
;$B
ü
 