B
    þ‘y\dP  ã               @   sh  d dl mZmZm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Zd dlZd dlmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ dd	gZe d
¡Zdd„ Zeƒ rÆg Zng ZG dd„ deƒZG dd	„ d	eƒZdd„ Ze dkrdd dl!m"Z" d dl#m$Z$ e" %d¡ e&e$dƒ '¡ ƒ ye&e$dƒ '¡ ƒ W n  e(k
rb   e&eƒ ƒ Y nX dS )é    )ÚdivisionÚabsolute_importÚprint_functionN)ÚPopenÚPIPEÚSTDOUT)Úfilepath_from_subprocess_output)Ú	FCompiler)Úget_exception)Úsystem_infoÚGnuFCompilerÚGnu95FCompilerzTarget: ([a-zA-Z0-9_\-]*)c               C   s   t jdkot ¡ d dkS )NÚwin32r   Z64bit)ÚsysÚplatformÚarchitecture© r   r   ú<lib/python3.7/site-packages/numpy/distutils/fcompiler/gnu.pyÚis_win64   s    r   c            
   @   s  e Zd ZdZdZdZdd„ Zdd„ Zdd	gZd
dgd
dddgd
d
d
ddgddgdgd
ddgdœZ	d
Z
d
Zejdkr‚ejdkr‚dgZejdkr¨xdD ]Ze	e  d¡ q’W dZdZdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd
S )/r   Úgnu)Úg77zGNU Fortran 77 compilerc             C   sð   x$|  d¡r$|| d¡d d… }qW t|ƒdkrvt d|¡}|rÜ|  d¡rZd| d¡fS | ¡ d	krÜd
| d¡fS nft d|¡}|r”d
| d¡fS t d|¡}|rÜ| d¡}|  d¡sÌ|  d¡sÌ|  d¡rÔd|fS d
|fS d}t|| ƒ‚dS )z6Handle the different versions of GNU fortran compilerszgfortran: warningÚ
é   Né   z	([0-9.]+)zGNU Fortranr   r   ÚgfortranzGNU Fortran\s+95.*?([0-9-.]+)z%GNU Fortran.*?\-?([0-9-.]+\.[0-9-.]+)Ú0Ú2Ú3z6A valid Fortran version was not found in this string:
)Ú
startswithÚfindÚlenÚreÚsearchÚgroupÚstartÚ
ValueError)ÚselfÚversion_stringÚmÚvÚerrr   r   r   Úgnu_version_match)   s*    

zGnuFCompiler.gnu_version_matchc             C   s&   |   |¡}|r|d dkrd S |d S )Nr   r   r   )r+   )r&   r'   r)   r   r   r   Úversion_matchU   s    
zGnuFCompiler.version_matchr   Zf77Nz-dumpversionz-gz-Wallz-fno-second-underscoreÚarz-crÚranlib)Úversion_cmdÚcompiler_f77Úcompiler_f90Úcompiler_fixÚ	linker_soÚarchiverr.   Ú
linker_exeÚntÚcygwinz-fPICr   )r/   r0   r3   r5   z-mno-cygwinÚg2cÚgnu95c             C   sÒ   | j dd … }tjdkr®tj dd ¡}|sœdd lm} i }y
|j}W n t	k
rX   Y nX |ƒ }| 
||¡ | dd¡}|tjd< |dkrœd}tj|dd | d	d
dg¡ n
| d¡ tj d¡rÎ| d¡ |S )Nr   ÚdarwinZMACOSX_DEPLOYMENT_TARGETr   z10.3z2Env. variable MACOSX_DEPLOYMENT_TARGET set to 10.3é   )Ú
stacklevelz
-undefinedZdynamic_lookupz-bundlez-sharedZsunosz-mimpure-text)r3   r   r   ÚosÚenvironÚgetZdistutils.sysconfigÚ	sysconfigÚget_makefile_filenameÚAttributeErrorZparse_makefileÚwarningsÚwarnÚextendÚappendr   )r&   ÚoptÚtargetZscÚgrA   ÚfilenameÚsr   r   r   Úget_flags_linker_sov   s,    




z GnuFCompiler.get_flags_linker_soc          	   C   sJ   yt  | jdg ¡}W n tt jfk
r0   Y nX t|ƒ}tj |¡S d S )Nz-print-libgcc-file-name)	Ú
subprocessÚcheck_outputr0   ÚOSErrorÚCalledProcessErrorr   r=   ÚpathÚdirname)r&   Úoutputr   r   r   Úget_libgcc_dir¢   s    zGnuFCompiler.get_libgcc_dirc          	   C   sˆ   t jd d… dkrd}nt jdkr(d}nd }d }|r„d |¡g}yt | j| ¡}W n ttjfk
rn   Y nX t|ƒ}t	j
 |¡}|S )Né   Úlinuxzlibgfortran.sor:   zlibgfortran.dylibz-print-file-name={0})r   r   ÚformatrM   rN   r0   rO   rP   r   r=   rQ   rR   )r&   Zlibgfortran_nameZlibgfortran_dirZfind_lib_argrS   r   r   r   Úget_libgfortran_dir­   s     
z GnuFCompiler.get_libgfortran_dirc             C   sà   g }t jd d… dkrÆ|  ¡ }|rÆt jdkr¼| d¡s¼tj |¡}tj |d| j ¡}tj 	|¡s¼tjj|ftj
fd žŽ }tj tj |d¡¡}tj |d| j ¡}tj 	|¡r¼| |¡ | |¡ |  ¡ }|rÜ| |¡ |S )NrU   rV   r   z/usr/libzlib%s.aé   Úlib)r   r   rT   r   r=   rQ   ÚnormpathÚjoinr8   ÚexistsÚpardirÚabspathrF   rX   )r&   rG   ÚdrQ   ÚrootZd2Úlib_gfortran_dirr   r   r   Úget_library_dirsÂ   s$    


zGnuFCompiler.get_library_dirsc             C   s¤   g }|   ¡ }|d k	rL| jd }| j|| jf }tj tj ||¡¡sR| j}n| j}|d k	rd| |¡ | j	}t
jdkrŒ|rŒ|jdkrŒ| d¡ t
jdkr | d¡ |S )Nz-picr   ÚmsvcÚgccr:   Ú
cc_dynamic)rT   r8   Zstatic_lib_formatZstatic_lib_extensionr=   rQ   Úisfiler\   rF   Ú
c_compilerr   r   Úcompiler_type)r&   rG   r`   r8   Úfrh   r   r   r   Úget_librariesØ   s"    





zGnuFCompiler.get_librariesc             C   s   dgS )Nz-gr   )r&   r   r   r   Úget_flags_debugí   s    zGnuFCompiler.get_flags_debugc             C   s0   |   ¡ }|r|dkrdg}ndg}| d¡ |S )Nz3.3.3z-O2z-O3z-funroll-loops)Úget_versionrF   )r&   r)   rG   r   r   r   Úget_flags_optð   s    
zGnuFCompiler.get_flags_optc             C   sd   ddl m} y| ¡ d }W n tk
r0   g S X t d¡}g }x| |¡D ]}|d|g7 }qLW |S )z( Return detected arch flags from CFLAGS r   )r@   ZCFLAGSz-arch\s+(\w+)z-arch)Ú	distutilsr@   Zget_config_varsÚKeyErrorr!   ÚcompileÚfindall)r&   r@   ZcflagsZarch_reÚ
arch_flagsÚarchr   r   r   Ú_c_arch_flagsû   s    
zGnuFCompiler._c_arch_flagsc             C   s   g S )Nr   )r&   r   r   r   Úget_flags_arch  s    zGnuFCompiler.get_flags_archc             C   sJ   t jd d… dkst jdkr t‚d|ks,t‚t jdkr:dnd}d||f S )Né   Úaixr   ú,r:   ú=z-Wl,-rpath%s%s)r   r   ÚNotImplementedErrorÚAssertionError)r&   ÚdirÚsepr   r   r   Úruntime_library_dir_option  s
    z'GnuFCompiler.runtime_library_dir_option)Ú__name__Ú
__module__Ú__qualname__ri   Úcompiler_aliasesÚdescriptionr+   r,   Úpossible_executablesÚexecutablesÚmodule_dir_switchÚmodule_include_switchr=   Únamer   r   Z	pic_flagsÚkeyrF   r8   Zsuggested_f90_compilerrL   rT   rX   rc   rk   rl   rn   ru   rv   r   r   r   r   r   r   $   sB   ,


,c            	   @   s€  e Zd ZdZdZdZdd„ Zg Ze 	d¡Z
e
dk	rDe ej e
¡¡ e dd	g¡ e 	d¡rte ej e 	d¡¡¡ d
dgdddddge ddddge dddddge d
ddgddgdgddgdœZdZdZejdd… dkr(ed  d¡ e ¡ d dd… dkr(xdD ]Zee  d¡ qW dZdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Z d1d2„ Z!dS )3r   r9   )r   zGNU Fortran 95 compilerc             C   s\   |   |¡}|r|d dkrd S |d }|dkr0n(tjdkrXxdD ]}| j|  d¡ q@W |S )Nr   r   r   z4.r   )r/   r0   r1   r2   r3   r5   z-mno-cygwin)r+   r   r   r†   rF   )r&   r'   r)   rŠ   r   r   r   r,     s    


zGnu95FCompiler.version_matchZGFORTRANNr   Zf95z<F90>z-dumpversionz-Wallz-gz-ffixed-formz-fno-second-underscorer-   z-crr.   )r/   r0   r1   r2   r3   r4   r.   r5   z-Jz-Irw   rx   r3   z	-lpthreadr   r;   Z64)r0   r1   r2   r3   r5   z-maix64c             C   s(   t jdksg S dt ¡ d d d…  gS )Nr:   z-mr   r;   )r   r   r   )r&   Úcmdr   r   r   Ú_universal_flagsP  s    
zGnu95FCompiler._universal_flagsc             C   s*   t  | ¡}|  | j¡}|r&||d d…< |S )Nr   )r   Ú	get_flagsrŒ   r1   )r&   Úflagsrs   r   r   r   r   U  s
    
zGnu95FCompiler.get_flagsc             C   s*   t  | ¡}|  | j¡}|r&||d d…< |S )Nr   )r   rL   rŒ   r3   )r&   rŽ   rs   r   r   r   rL   \  s
    
z"Gnu95FCompiler.get_flags_linker_soc       	      C   s²   t  | ¡}tjdkr˜| j}|r˜|jdkr˜|  ¡ }|r˜tj 	|  
¡ ¡}tjj|ftjfd žŽ }tj |d¡}tj 	|¡}tj tj |d¡¡r˜| |¡ |  ¡ }|r®| |¡ |S )Nr   rd   rY   rZ   zlibmingwex.a)r   rc   r   r   rh   ri   Ú
get_targetr=   rQ   r[   rT   r\   r^   r]   rF   rX   )	r&   rG   rh   rH   r`   ra   rQ   Zmingwdirrb   r   r   r   rc   c  s     



zGnu95FCompiler.get_library_dirsc             C   sŠ   t  | ¡}tjdkr| d¡ tjdkr†| j}|rn|jdkrnd|krn| d¡}| |d d¡ | |d d¡ | j}|r†|jdkr†g S |S )	Nr:   rf   r   rd   re   r   ZmingwexZmingw32)	r   rk   r   r   Úremoverh   ri   ÚindexÚinsert)r&   rG   rh   Úir   r   r   rk   v  s    




zGnu95FCompiler.get_librariesc          	   C   sV   yt  | jdg ¡}W n tt jfk
r0   Y n"X t|ƒ}t |¡}|rR| d¡S dS )Nz-vr   Ú )	rM   rN   r0   rO   rP   r   ÚTARGET_Rr"   r#   )r&   rS   r(   r   r   r   r   ˆ  s    

zGnu95FCompiler.get_targetc          
   C   s|   t  ¡ }xB|D ]:}t|dƒ&}x| d¡}|s0P | |¡ q W W d Q R X qW t | ¡ ¡}tj	d dkrr| 
d¡}| d¡S )NÚrbi   r   rw   Úasciirz   )ÚhashlibZsha1ÚopenÚreadÚupdateÚbase64Z	b32encodeZdigestr   Úversion_infoÚdecodeÚrstrip)r&   Ú	filenamesÚhÚfnrj   ÚblockÚtextr   r   r   Ú_hash_files”  s    


zGnu95FCompiler._hash_filesc             C   s`  | j }|jdkrtdƒ‚|  t|ƒt|ƒ ¡}tƒ r:d}nd}dtj tj 	|d ¡¡d dd…  }	|	d	 | d
 | }
|
d }|
d }|
d }tj 
||¡}tj 
||¡}tj 
||¡}tj |¡rÐ||fS |rèdgt|ƒ dg }| j|||t|ƒdd| ddddg d tƒ r d}nd}d| d| |g}|jsF| ¡  | |jg| ¡ ||fS )zeCreate a wrapper shared library for the given objects

        Return an MSVC-compatible lib
        rd   zThis method only supports MSVCZ	win_amd64r   rZ   r   Né   Ú.z
.gfortran-z.dllz.defz.libz-Wl,--whole-archivez-Wl,--no-whole-archivez-Wl,--allow-multiple-definitionz-Wl,--output-def,z-Wl,--export-all-symbolsz-Wl,--enable-auto-importz-staticz-mlong-double-64)Ú
output_dirZextra_postargsz/MACHINE:X64z/MACHINE:X86z/def:z/OUT:)rh   ri   r%   r¥   Úlistr   r=   rQ   ÚsplitextÚbasenamer\   rg   Zlink_shared_objectZinitializedZ
initializeZspawnrZ   )r&   Úobjectsr¨   Úextra_dll_dirÚchained_dllsÚ
is_archiverh   Zobject_hashÚtagr«   Z	root_nameZdll_nameZdef_nameZlib_nameZdll_pathZdef_pathZlib_pathZ	specifierZlib_argsr   r   r   Ú_link_wrapper_lib¢  sP    
 z Gnu95FCompiler._link_wrapper_libc             C   s
   |j dkS )N)rd   )ri   )r&   Zcompilerr   r   r   Úcan_ccompiler_linkà  s    z!Gnu95FCompiler.can_ccompiler_linkc             C   sÎ   | j jdkrÂg }g }x0|D ](}| ¡  d¡r8| |¡ q| |¡ qW g }g }xH|ddd… D ]6}	| j|	g|||dd\}
}| d|
¡ | d|¡ q^W |s |S | j||||dd\}
}|
g| S td	ƒ‚dS )
z†
        Convert a set of object files that are not compatible with the default
        linker, to a file that is compatible.
        rd   z.aNéÿÿÿÿT)r®   r¯   r   FzUnsupported C compiler)rh   ri   ÚlowerÚendswithrF   r±   r’   r%   )r&   r¬   r¨   r­   ZarchivesZplain_objectsÚobjZchained_libsr®   ÚarchiverZ   Zdllr   r   r   Úwrap_unlinkable_objectsä  s8    

z&Gnu95FCompiler.wrap_unlinkable_objects)"r€   r   r‚   ri   rƒ   r„   r,   r…   r=   ÚgetenvZ_env_gfortranrF   rQ   r«   rE   Ú_EXTRAFLAGSr†   r‡   rˆ   r   r   r   rŠ   r8   rŒ   r   rL   rc   rk   r   r¥   r±   r²   r¸   r   r   r   r   r     sP   


>c          	   C   sª   | dd… }t jdd\}}t |¡ zrtj |¡}tj |¡d d }z4| d|d|g¡ t|t	t
|d}| ¡  |jdkS tj |¡r”t |¡ X W dt |¡ X d	S )
z7Return true if the architecture supports the -arch flagNz.f)Úsuffixr   z.oz-archz-c)ÚstderrÚstdoutÚcwdF)ÚtempfileZmkstempr=   ÚcloserQ   rR   rª   rE   r   r   r   ZcommunicateÚ
returncoder]   r   )r‹   rt   ZnewcmdZfidrJ   r`   rS   Úpr   r   r   Ú_can_target  s    

rÃ   Ú__main__)Úlog)Úcustomized_fcompilerr;   r   Zg95))Z
__future__r   r   r   r!   r=   r   rC   r   r¿   r˜   rœ   rM   r   r   r   Znumpy.distutils.exec_commandr   Znumpy.distutils.fcompilerr	   Znumpy.distutils.compatr
   Znumpy.distutils.system_infor   Z	compilersrq   r•   r   rº   r   r   rÃ   r€   ro   rÅ   Znumpy.distutilsrÆ   Zset_verbosityÚprintrm   Ú	Exceptionr   r   r   r   Ú<module>   sD   
 t |

