a
    hÝEbÃW  ã                   @   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Zddl	m
Z
 ddlZddlmZ ddlmZ ddlmZ ddlmZmZmZmZ dd	„ Zeej_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�rze .d)e-¡ /¡ \Z0Z1e-e*e0e1 < [0[1[-W n e2�yœ   e
 3d*¡ Y n0 d+d,„ Z4d;d.d/„Z5d0d1„ Z6d2d3„ Z7d4d5„ Z8d6d7„ Z9d8d9„ Z:d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_version)Ú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   )Zmsvcr© r
   ú`/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/numpy/distutils/mingw32ccompiler.pyÚget_msvcr_replacement#   s    r   z\[Ordinal/Name Pointer\] Tablez$^\s+\[([\s*[0-9]*)\] ([a-zA-Z0-9_]*)c                   @   s2   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.

    Zmingw32r   c                 C   s’   t jj | |||¡ tƒ  tƒ }tdd�}|s2|r<|  d¡ tƒ }|rV|  dd| ¡ tƒ dkrt| j	ddd	d
d� n| j	ddddd� dg| _
d S )NT)ÚdebugZNPY_MINGW_USE_CUSTOM_MSVCRZ__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_libraryZdefine_macror   r	   Úset_executablesÚcompiler_cxx)ÚselfÚverboseÚdry_runÚforceZmsvcr_successZmsvcr_dbg_successZmsvcr_versionr
   r
   r   r   8   s4    ÿ


ûüzMingw32CCompiler.__init__Nc                 C   sZ   t ƒ }|r|sg }| |¡ | |||||||d |	|
|||f}tj}||d |jj… Ž  d S )N)r   Úappendr   ÚlinkÚ__code__Úco_argcount)r   Ztarget_descÚobjectsZoutput_filenameÚ
output_dirÚ	librariesÚlibrary_dirsÚruntime_library_dirsÚexport_symbolsr   Zextra_preargsZextra_postargsÚ
build_tempZtarget_langZruntime_libraryÚargsÚfuncr
   r
   r   r!   p   s.    
ózMingw32CCompiler.linkÚ c           	      C   sÒ   |d u rd}g }|D ]¸}t j t j |¡¡\}}t j |¡\}}|rP|dd … }|| jddg vrrtd||f ƒ‚|r‚t j |¡}|dks’|dkr²| t j 	||| | j
 ¡¡ q| t j 	||| j
 ¡¡ q|S )Nr-   é   ú.rcz.resz"unknown file type '%s' (from '%s'))ÚosÚpathÚsplitextÚnormcaseÚ
splitdriveZsrc_extensionsr   Úbasenamer    ÚjoinZobj_extension)	r   Zsource_filenamesZ	strip_dirr%   Z	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!   r;   r
   r
   r
   r   r   1   s       ý
@      ó
)  ýr   c            
      C   sH  t jg} tt dƒr,t jt jkr,|  t j¡ n"tt dƒrNt jt jkrN|  t j¡ g d¢}g }| D ]"}|D ]}| tj ||¡¡ qfq^dtj	v r¦| tj tj	d d¡¡ t
t jd d… ƒ\}}t ¡ }|dkrÞd|› |› d	�}n|d
krôd|› d�}nd}td| ƒ |D ]*}tj ||¡}	tj |	¡�r|	  S �qtd||f ƒ‚d S )NÚbase_prefixÚreal_prefix)r-   ÚlibÚbinZ
SYSTEMROOTZSystem32é   ÚCPythonÚpythonú.dllÚPyPyZlibpypyz-c.dllz!Unknown platform {implementation}zLooking for %sz%s not found in %s)ÚsysÚprefixÚhasattrrA   r    rB   r0   r1   r6   ÚenvironÚtupleÚversion_infoÚplatformÚpython_implementationÚprintÚexistsÚ
ValueError)
ÚstemsÚsub_dirsÚlib_dirsÚstemÚfolderÚmajor_versionÚminor_versionÚimplementationÚdllnameÚdllr
   r
   r   Úfind_python_dllº   s2    
r_   c                 C   s   t  dd| g¡}| d¡S )Nzobjdump.exez-pó   
)Ú
subprocessÚcheck_outputÚsplit)r^   Ústr
   r
   r   Ú
dump_tableã   s    re   c           	      C   s,  t | ƒ}tt|ƒƒD ]}t ||  ¡ ¡r q8qtdƒ‚g }t|d t|ƒƒD ]B}t ||  ¡ ¡}|rŒ| t	| 
d¡ ¡ ƒ| 
d¡f¡ qN q’qNt|ƒdkr¬t d|  ¡ t|dƒ�`}| dtj | ¡ ¡ | d¡ | d	¡ | d
¡ |D ]}| d|d  ¡ qðW d  ƒ n1 �s0    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.   rE   r   zNo symbols found in %sÚwzLIBRARY        %s
z,;CODE          PRELOAD MOVEABLE DISCARDABLE
z;DATA          PRELOAD SINGLE
z	
EXPORTS
z%s
N)re   ÚrangeÚlenÚ_STARTÚmatchÚdecoderT   Ú_TABLEr    ÚintÚgroupÚstripr   ÚwarnÚopenÚwriter0   r1   r5   )	r^   ÚdfileÚdumpÚiZsymsÚjÚmÚdÚsr
   r
   r   Úgenerate_defç   s(    $


rz   c                    s4   dddœt ƒ  ‰ ‡ fdd„}dd„ }|| ƒp2|| ƒS )NÚamd64Úx86)r   ÚIntelc                    sd   t j t j dd¡d¡}t j |¡s(d S t  |¡D ],\}}}| |v r2ˆ |v r2t j || ¡  S q2d S )NZWINDIRz
C:\WINDOWSZwinsxs)r0   r1   r6   rM   ÚgetrS   Úwalk)Údll_nameZ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ú;)	rJ   rK   r0   rM   rc   r1   r6   rS   Úabspath)r€   r1   Ú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ƒ }| rR|d7 }d| }t j tj	d|¡}t j 
|¡rŒt d	|f ¡ d
S |d }t|ƒ}|s²t 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 presentrx   zlib%s.aÚlibsz(Skip building msvcr library: "%s" existsTrH   z*Cannot build msvcr library: "%s" not foundz	lib%s.defz&Building msvcr library: "%s" (from %s)Údlltoolú-dú-l)r0   Únamer   r   r   r   r1   r6   rJ   rK   ÚisfilerŒ   rp   Úinforz   ra   ÚcallÚremove)r   Z	msvcr_verZ
msvcr_nameZout_nameÚout_fileZ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r0tƒ S td|  ƒ‚d S )Nr�   r   r}   zUnhandled arch %s)r0   r“   r	   Ú_build_import_library_amd64Ú_build_import_library_x86rT   r„   r
   r
   r   r   \  s    
r   c               
   C   sæ   t tjdd… ƒ\} }g d¢}tjg}ttdƒrJtjtjkrJ| tj¡ n"ttdƒrltjtjkrl| tj¡ ddg}g }|D ]:}|| |f }|D ]$}|D ]}	| tj	 
||	|¡¡ q˜q�q||D ]}
tj	 |
¡r¼d|
f  S q¼d	|d
 fS )zACheck if an import library for the Python runtime already exists.NrE   )zlibpython%d%d.azlibpython%d%d.dll.azlibpython%d.%d.dll.arA   rB   r�   rC   TFr   )rN   rJ   rO   rK   rL   rA   r    rB   r0   r1   r6   r”   )rZ   r[   ÚpatternsrU   rV   Ú
candidatesÚpatÚfilenameZstem_dirrY   Úfullnamer
   r
   r   Ú_check_for_import_libh  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.defrE   r�   r�   r‘   r’   )r¥   r   r   r_   r•   rN   rJ   rO   r0   r1   r6   rK   rz   ra   Ú
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 
|¡s´ttdƒrptj tjd|¡}n"ttdƒrŽtj tjd|¡}nd}tj 
|¡r¤|}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 �sL0    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.librE   r�   rA   rB   r-   z+Cannot build import library: "%s" not foundz(Building import library (ARCH=x86): "%s"r   )Úlib2defr§   F)Úshellrf   r�   z	--dllnamez--defz--output-libz:Failed to build import library for gcc. Linking will fail.)r¥   r   r   rN   rJ   rO   r0   r1   r6   rK   r”   rL   rA   rB   rp   r•   Únumpy.distutilsrª   ZgetnmZ
DEFAULT_NMZparse_nmrq   Z
output_defZ
DEF_HEADERr_   ra   rb   )r©   r˜   Zlib_nameZlib_fileZbase_librª   rš   r›   Z	nm_outputZdlistÚflistZfidr€   rœ   Ústatusr
   r
   r   rŸ      sH    


ÿ2ý

rŸ   Úwin32z8.0.50727.42Ú80z9.0.21022.8Z90z10.0.30319.460Ú100ZCRT_ASSEMBLY_VERSIONz(\d+)\.(\d)z9Cannot import msvcrt: using manifest will not be possiblec                 C   sX   zt t| d | ƒ }W n$ ty<   td| |f ƒd‚Y n0 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ÚKeyErrorrT   ÚtextwrapÚdedent)r´   rµ   r³   Útemplater
   r
   r   Úmsvc_manifest_xmlù  s    ÿÿ
r¼   r^   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

    r^   rE   Zexer.   zType %s not supportedz&#include "winuser.h"
%d RT_MANIFEST %s)rT   )r“   ÚtypeZrctyper
   r
   r   Úmanifest_rc  s    þr¾   c                 C   s.   t ƒ }|r*|t| ƒks*tdt| ƒ|f ƒ‚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   rm   rT   )Úmsverr´   r
   r
   r   Ú!check_embedded_msvcr_match_linked1  s    
þÿrÀ   c                 C   s&   t j |  dg d¡¡}t j |¡d S )NZyoÚcr   )r0   r1   r5   Z_gen_temp_sourcefiler2   )Úconfigr8   r
   r
   r   Úconfigtest_name=  s    rÃ   c                 C   s   t | ƒ}| jj}|| d S )Nz	.manifest)rÃ   r   Zexe_extension)rÂ   r�   Zexextr
   r
   r   Úmanifest_nameA  s    rÄ   c                 C   s   t | ƒ}|d S )Nr/   )rÃ   )rÂ   r�   r
   r
   r   Úrc_nameG  s    rÅ   c                 C   sŽ   t ƒ }|d urŠ|dkrŠt|ƒ t|ƒ d¡\}}tt|ƒt|ƒƒ}tt| ƒdƒ�*}| j 	t| ƒ¡ | 
|¡ W d   ƒ n1 s€0    Y  d S )Né   Ú.rf   )Úget_build_msvc_versionrÀ   r·   rc   r¼   rm   rq   rÄ   Z
temp_filesr    rr   )rÂ   r¿   Zma_strZmi_strZmanxmlÚmanr
   r
   r   Úgenerate_manifestL  s    rÊ   )F)r^   );r?   r0   rP   rJ   ra   Úrer¹   Znumpy.distutils.ccompilerÚnumpyr¬   r   Zdistutils.cygwinccompilerr   Zdistutils.unixccompilerr   Zdistutils.msvccompilerr   rÈ   Údistutils.errorsr   Znumpy.distutils.misc_utilr   r   r   r	   r   r   Z	get_msvcrÚcompileri   rl   r   r   r_   re   rz   rŒ   r   r   r¥   rž   rŸ   r¶   ÚmsvcrtÚgetattrZcrt_verrj   Úgroupsr´   rµ   ÚImportErrorrp   r¼   r¾   rÀ   rÃ   rÄ   rÅ   rÊ   r
   r
   r
   r   Ú<module>   sd   	

 
) 
;$B
 
