U
    X	¸aRc  ã                   @   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 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(< d)e,d*< e.e-d+ƒrˆe-j/ 0d,d-¡\Z1Z2Z3e-j/e,e1e2 < [1[2[3W n  e4k
rª   e
 5d.¡ Y nX d/d0„ Z6d?d2d3„Z7d4d5„ Z8d6d7„ Z9d8d9„ Z:d:d;„ Z;d<d=„ 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)ÚStrictVersion)ÚUnixCCompiler)Úget_build_version)ÚUnknownFileError)Úmsvc_runtime_libraryÚmsvc_runtime_versionÚmsvc_runtime_majorÚget_build_architecturec                  C   s   t ƒ } | dkrg S | gS )zBReplacement for outdated version of get_msvcr from cygwinccompilerN)r   )Zmsvcr© r   úD/tmp/pip-unpacked-wheel-zbzmve17/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 | |||¡ | jd krnzt ddg¡}W n ttfk
rL   d}Y nX t	 
d|¡}|rnt| d¡ƒ| _| jdkr~d}nd}| jdkr”d| _n| jdkr¤d	| _tƒ  tƒ }td
d}|sÂ|rÌ|  d¡ tƒ }	|	ræ|  dd|	 ¡ tƒ dkr&| jdk r| jddddd n| jddddd n\| jdkrP| jdddd| j|f d n2| jdk rp| jdd dd!d n| jd"d#d$d%d d	g| _d S )&NZgccz-dumpversionÚ z
(\d+\.\d+)é   z2.91.57z--entry _DllMain@12Zdllwrapzg++T)ÚdebugZNPY_MINGW_USE_CUSTOM_MSVCRZ__MSVCRT_VERSION__z0x%04iÚAMD64z4.0z/gcc -g -DDEBUG -DMS_WIN64 -mno-cygwin -O0 -WallzCgcc -g -DDEBUG -DMS_WIN64 -mno-cygwin -O0 -Wall -Wstrict-prototypeszgcc -g -mno-cygwinzgcc -g -mno-cygwin -shared)ÚcompilerÚcompiler_soÚ
linker_exeÚ	linker_soz#gcc -g -DDEBUG -DMS_WIN64 -O0 -Wallz7gcc -g -DDEBUG -DMS_WIN64 -O0 -Wall -Wstrict-prototypeszgcc -gzgcc -g -sharedú3.0.0zgcc -mno-cygwin -O2 -wz0gcc -mno-cygwin -mdll -O2 -w -Wstrict-prototypeszg++ -mno-cygwinz%s -mno-cygwin -mdll -static %szgcc -mno-cygwin -O2 -Wallz-gcc -mno-cygwin -O2 -Wall -Wstrict-prototypeszg++ -mno-cygwin -sharedzgcc -O2 -Wallz!gcc -O2 -Wall -Wstrict-prototypeszg++ zg++ -shared)Ú	distutilsÚcygwinccompilerÚCygwinCCompilerÚ__init__Úgcc_versionÚ
subprocessÚcheck_outputÚOSErrorÚCalledProcessErrorÚreÚsearchr   ÚgroupZ
linker_dllZlinkerÚbuild_import_libraryÚbuild_msvcr_libraryZdefine_macror   r
   Úset_executablesÚcompiler_cxx)
ÚselfÚverboseÚdry_runÚforceZ
out_stringÚresultZentry_pointZmsvcr_successZmsvcr_dbg_successZmsvcr_versionr   r   r   r   9   s€     ÿ






ûüÿûûýzMingw32CCompiler.__init__Nc                 C   sp   t ƒ }|r|sg }| |¡ | |||||||d |	|
|||f}| jdk rRtjjj}ntj}||d |jj	… Ž  d S )Nr   )
r   Úappendr   r   r   r   Úlinkr   Ú__code__Úco_argcount)r(   Ztarget_descZ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.   ¦   s2    
ó
zMingw32CCompiler.linkr   c           	      C   sÒ   |d krd}g }|D ]¸}t j t j |¡¡\}}t j |¡\}}|rP|dd … }|| jddg krrtd||f ƒ‚|r‚t j |¡}|dks’|dkr²| t j 	||| | j
 ¡¡ q| t j 	||| j
 ¡¡ q|S )Nr   r   ú.rcz.resz"unknown file type '%s' (from '%s'))ÚosÚpathÚsplitextÚnormcaseÚ
splitdriveZsrc_extensionsr   Úbasenamer-   ÚjoinZobj_extension)	r(   Zsource_filenamesZ	strip_dirr1   Z	obj_namesÚsrc_nameÚbaseÚextÚdrvr   r   r   Úobject_filenamesÐ   s0     ÿÿÿÿz!Mingw32CCompiler.object_filenames)r   r   r   )Nr   NNNN)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úcompiler_typer   r.   rE   r   r   r   r   r   2   s       ý
u      ó
,  ýr   c            
      C   sJ  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¡ dddg}g }| D ]"}|D ]}| tj ||¡¡ qhq`dtj	k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_prefixr   Ú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ÚhasattrrK   r-   rL   r:   r;   r@   Ú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    

ri   c                 C   s   t  dd| g¡}| d¡S )Nzobjdump.exez-pó   
)r   r   Úsplit)rh   Ústr   r   r   Ú
dump_table  s    rm   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ƒV}| dtj | ¡ ¡ | d¡ | d	¡ | d
¡ |D ]}| d|d  ¡ qðW 5 Q R X 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   rO   r   zNo symbols found in %sÚwzLIBRARY        %s
z,;CODE          PRELOAD MOVEABLE DISCARDABLE
z;DATA          PRELOAD SINGLE
z	
EXPORTS
z%s
N)rm   ÚrangeÚlenÚ_STARTÚmatchÚdecoder^   Ú_TABLEr-   Úintr#   Ústripr   ÚwarnÚopenÚwriter:   r;   r?   )	rh   ÚdfileÚdumpÚiZsymsÚjÚmÚdÚsr   r   r   Úgenerate_def   s(    $


r   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 ],\}}}| |kr2ˆ |kr2t j || ¡  S q2d S )NZWINDIRz
C:\WINDOWSZwinsxs)r:   r;   r@   rW   Úgetr]   Úwalk)Údll_nameZwinsxs_pathÚrootÚdirsÚfiles©Úarchr   r   Ú_find_dll_in_winsxsE  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ú;)	rT   rU   r:   rW   rk   r;   r@   r]   Úabspath)r‡   r;   Úfilepathr   r   r   Ú_find_dll_in_pathP  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 k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 presentr   zlib%s.aÚlibsz(Skip building msvcr library: "%s" existsTrR   z*Cannot build msvcr library: "%s" not foundz	lib%s.defz&Building msvcr library: "%s" (from %s)Údlltoolú-dú-l)r:   Únamer	   r   r   r   r;   r@   rT   rU   Úisfiler“   rw   Úinfor   r   Ú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%   Z  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)r:   rš   r
   Ú_build_import_library_amd64Ú_build_import_library_x86r^   r‹   r   r   r   r$   •  s    
r$   c               
   C   sè   t tjdd… ƒ\} }dddg}tjg}ttdƒrLtjtjkrL| tj¡ n"ttdƒrntjtjkrn| 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.NrO   zlibpython%d%d.azlibpython%d%d.dll.azlibpython%d.%d.dll.arK   rL   r–   rM   TFr   )rX   rT   rY   rU   rV   rK   r-   rL   r:   r;   r@   r›   )rd   re   Úpatternsr_   r`   Ú
candidatesÚpatÚfilenameZstem_dirrc   Úfullnamer   r   r   Ú_check_for_import_lib¡  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.defrO   r–   r—   r˜   r™   )r¬   r   r   ri   rœ   rX   rT   rY   r:   r;   r@   rU   r   r   Ú
check_call)Ú
out_existsrŸ   r    r¡   r¢   r£   r   r   r   r¥   Å  s    
ÿ
r¥   c               	   C   sv  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 5 Q R X tƒ }dd|d|d|g}t |¡}|rrt d¡ dS )z; Build the import libraries for Mingw32-gcc on Windows
    r­   Nzpython%d%d.librO   r–   rK   rL   r   z+Cannot build import library: "%s" not foundz(Building import library (ARCH=x86): "%s"r   )Úlib2defr®   F)Úshellrn   r—   z	--dllnamez--defz--output-libz:Failed to build import library for gcc. Linking will fail.)r¬   r   r   rX   rT   rY   r:   r;   r@   rU   r›   rV   rK   rL   rw   rœ   Únumpy.distutilsr±   ZgetnmZ
DEFAULT_NMZparse_nmrx   Z
output_defZ
DEF_HEADERri   r   r   )r°   rŸ   Zlib_nameZlib_fileZbase_libr±   r¡   r¢   Z	nm_outputZdlistÚflistZfidr‡   r£   Ústatusr   r   r   r¦   Ù  sP    



 ÿ   ý

r¦   Úwin32z8.0.50727.42Ú80z9.0.21022.8Z90z10.0.30319.460Z100z14.15.26726.0Z140ÚCRT_ASSEMBLY_VERSIONÚ.rO   z9Cannot import msvcrt: using manifest will not be possiblec                 C   sZ   zt t| d | ƒ }W n& tk
r>   td| |f ƒd‚Y nX 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ÚKeyErrorr^   ÚtextwrapÚdedent)r¼   r½   r»   Útemplater   r   r   Úmsvc_manifest_xml2  s    ÿÿ
rÄ   rh   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

    rh   rO   Zexer   zType %s not supportedz&#include "winuser.h"
%d RT_MANIFEST %s)r^   )rš   ÚtypeZrctyper   r   r   Úmanifest_rcR  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	   ru   r^   )Úmsverr¼   r   r   r   Ú!check_embedded_msvcr_match_linkedj  s    
þÿrÈ   c                 C   s&   t j |  dg d¡¡}t j |¡d S )NZyoÚcr   )r:   r;   r?   Z_gen_temp_sourcefiler<   )ÚconfigrB   r   r   r   Úconfigtest_namev  s    rË   c                 C   s   t | ƒ}| jj}|| d S )Nz	.manifest)rË   r   Zexe_extension)rÊ   rˆ   Zexextr   r   r   Úmanifest_namez  s    rÌ   c                 C   s   t | ƒ}|d S )Nr9   )rË   )rÊ   rˆ   r   r   r   Úrc_name€  s    rÍ   c                 C   st   t ƒ }|d k	rp|dkrpt|ƒ t|ƒ}t|| d ƒ}t||ƒ}tt| ƒdƒ}| j t| ƒ¡ | |¡ | 	¡  d S )Né   rº   rn   )
Úget_build_msvc_versionrÈ   ru   rÄ   rx   rÌ   Z
temp_filesr-   ry   Úclose)rÊ   rÇ   ÚmaÚmiZmanxmlZmanr   r   r   Úgenerate_manifest…  s    

rÓ   )F)rh   )=rI   r:   rZ   rT   r   r!   rÁ   Znumpy.distutils.ccompilerZnumpyr³   r   Zdistutils.cygwinccompilerr   Zdistutils.versionr   Zdistutils.unixccompilerr   Zdistutils.msvccompilerr   rÏ   Údistutils.errorsr   Znumpy.distutils.misc_utilr   r   r	   r
   r   r   Z	get_msvcrÚcompilerq   rt   r   r   ri   rm   r   r“   r%   r$   r¬   r¥   r¦   r¾   ÚmsvcrtrV   r¸   rk   ÚmajorÚminorÚrestÚImportErrorrw   rÄ   rÆ   rÈ   rË   rÌ   rÍ   rÓ   r   r   r   r   Ú<module>   sd   	

 B) 
;$B
 
