a
    p=icP  ã                
   @   sF  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gZe  d¡Zd	d
„ ZG dd„ deƒZG dd„ deƒZdd„ ZedkrBd dlmZ d dlmZ e d¡ eedƒ  ¡ ƒ zeedƒ  ¡ ƒ W n. e!y@ Z" zee"ƒ W Y dZ"["n
dZ"["0 0 dS )é    N)ÚPopenÚPIPEÚSTDOUT)Úfilepath_from_subprocess_output)Ú	FCompiler)ÚLooseVersionÚGnuFCompilerÚGnu95FCompilerzTarget: ([a-zA-Z0-9_\-]*)c                   C   s   t jdkot ¡ d dkS )NÚwin32r   Ú64bit)ÚsysÚplatformÚarchitecture© r   r   ún/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/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g d¢d
d
g d¢ddgdgg d¢dœZ	d
Z
d
ZejdkrzejdkrzdgZejdkrœdD ]Ze	e  d¡ qˆ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ð   |  d¡r&|| d¡d d…  ¡ }q 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ÚstripÚ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_matchL   s    
zGnuFCompiler.version_matchr   Zf77Nú-dumpversion)Nú-gú-Wallú-fno-second-underscore)Nr,   r-   Úarú-crÚranlib©Úversion_cmdÚcompiler_f77Úcompiler_f90Úcompiler_fixÚ	linker_soÚarchiverr1   Ú
linker_exeÚntÚcygwinz-fPICr
   )r3   r4   r7   r9   ú-mno-cygwinÚg2cÚgnu95c                 C   sž   | j dd … }tjdkrztj dd ¡}|sjdd l}| d¡}|s\d}d|› }tj	|dd t
|ƒtjd< | g d	¢¡ n
| d
¡ tj d¡rš| d¡ |S )Nr   ÚdarwinÚMACOSX_DEPLOYMENT_TARGETr   z10.9z.Env. variable MACOSX_DEPLOYMENT_TARGET set to é   )Ú
stacklevel)z
-undefinedZdynamic_lookupz-bundlez-sharedÚsunosz-mimpure-text)r7   r   r   ÚosÚenvironÚgetÚ	sysconfigÚget_config_varÚwarningsÚwarnÚstrÚextendÚappendr   )r$   ÚoptÚtargetrG   Úsr   r   r   Úget_flags_linker_som   s     




z GnuFCompiler.get_flags_linker_soc              	   C   sH   zt  | jdg ¡}W n tt jfy.   Y n0 t|ƒ}tj |¡S d S )Nz-print-libgcc-file-name)	Ú
subprocessÚcheck_outputr4   ÚOSErrorÚCalledProcessErrorr   rD   Ú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}zt | j| ¡}W n ttjfyl   Y n0 t|ƒ}t	j
 |¡}|S )Né   Úlinuxzlibgfortran.sor?   zlibgfortran.dylibz-print-file-name={0})r   r   ÚformatrR   rS   r4   rT   rU   r   rD   rV   rW   )r$   Zlibgfortran_nameZlibgfortran_dirZfind_lib_argrX   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|gtj
fd ¢R Ž }tj tj |d¡¡}tj |d| j ¡}tj 	|¡r¾| |¡ | |¡ |  ¡ }|rÞ| |¡ |S )NrZ   r[   r
   z/usr/libzlib%s.aé   Úlib)r   r   rY   r   rD   rV   ÚnormpathÚjoinr=   ÚexistsÚpardirÚabspathrM   r]   )r$   rN   ÚdrV   ÚrootÚd2Úlib_gfortran_dirr   r   r   Úget_library_dirs°   s$    


zGnuFCompiler.get_library_dirsc                 C   s¤   g }|   ¡ }|d urL| jd }| j|| jf }tj tj ||¡¡sR| j}n| j}|d u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)rY   r=   Zstatic_lib_formatZstatic_lib_extensionrD   rV   Úisfilera   rM   Ú
c_compilerr   r   Úcompiler_type)r$   rN   re   r=   Úfrn   r   r   r   Úget_librariesÆ   s$    

ÿ


zGnuFCompiler.get_librariesc                 C   s   dgS )Nr,   r   ©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_versionrM   )r$   r'   rN   r   r   r   Úget_flags_optÞ   s    
zGnuFCompiler.get_flags_optc                 C   s^   ddl }z| ¡ d }W n ty.   g  Y S 0 t d¡}g }| |¡D ]}|d|g7 }qH|S )z( Return detected arch flags from CFLAGS r   NÚCFLAGSz-arch\s+(\w+)ú-arch)rG   Úget_config_varsÚKeyErrorr   ÚcompileÚfindall)r$   rG   ÚcflagsZarch_reÚ
arch_flagsÚarchr   r   r   Ú_c_arch_flagsé   s    

zGnuFCompiler._c_arch_flagsc                 C   s   g S )Nr   rr   r   r   r   Úget_flags_archö   s    zGnuFCompiler.get_flags_archc                 C   s\   t jdkst jdkrt‚d|vs$J ‚t jdkr8d|› S t j d¡rNd|› S d|› S d S )	Nr
   r;   ú,r?   z-Wl,-rpath,©ÚaixZos400z-Wl,-blibpath:z-Wl,-rpath=)r   r   ÚNotImplementedErrorr   )r$   Údirr   r   r   Úruntime_library_dir_optionù   s    


z'GnuFCompiler.runtime_library_dir_option)Ú__name__Ú
__module__Ú__qualname__ro   Úcompiler_aliasesÚdescriptionr)   r*   Úpossible_executablesÚexecutablesÚmodule_dir_switchÚmodule_include_switchrD   Únamer   r   Z	pic_flagsÚkeyrM   r=   Zsuggested_f90_compilerrQ   rY   r]   ri   rq   rs   ru   r   r€   r†   r   r   r   r   r      sD   -ø

#c                	   @   s  e Zd ZdZdZdZdd„ ZddgZdd	gg d
¢g d¢g d
¢g d¢ddgdgddgdœZdZ	dZ
ej d¡rªed  d¡ e ¡ d dd… dkrªdD ]Zee  d¡ q–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/d0„ ZdS )1r	   r>   )r   zGNU Fortran 95 compilerc                 C   s\   |   |¡}|r|d dkrd S |d }t|ƒdkr4n$tjdkrXdD ]}| j|  d¡ qB|S )Nr   r   r   Ú4r
   )r3   r4   r5   r6   r7   r9   r<   )r)   r   r   r   r   rM   )r$   r%   r'   r‘   r   r   r   r*     s    

zGnu95FCompiler.version_matchr   Zf95ú<F90>r+   )Nr-   r,   z-ffixed-formr.   )Nr-   r,   r.   )r“   r-   r,   r/   r0   r1   Nr-   r2   z-Jz-Ir‚   r7   z	-lpthreadr   rA   Z64)r4   r5   r6   r7   r9   z-maix64c                 C   s^   t jdksg S g }|  ¡ }d|v r0d|| d¡< dD ]$}t||ƒr4||v r4| d|g¡ q4|S )z>Return a list of -arch flags for every supported architecture.r?   Úi386Úi686)Úppcr•   Úx86_64Úppc64Ús390xrw   )r   r   r   ÚindexÚ_can_targetrL   )r$   Úcmdr}   Zc_archsr~   r   r   r   Ú_universal_flags<  s    
zGnu95FCompiler._universal_flagsc                 C   s*   t  | ¡}|  | j¡}|r&||d d…< |S ©Nr   )r   Ú	get_flagsr   r5   ©r$   Úflagsr}   r   r   r   rŸ   L  s
    
zGnu95FCompiler.get_flagsc                 C   s*   t  | ¡}|  | j¡}|r&||d d…< |S rž   )r   rQ   r   r7   r    r   r   r   rQ   S  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|gtjfd ¢R Ž }tj |d¡}tj 	|¡}tj tj |d¡¡rš| |¡ |  ¡ }|r°| |¡ |S )Nr
   rj   r^   r_   zlibmingwex.a)r   ri   r   r   rn   ro   Ú
get_targetrD   rV   r`   rY   ra   rc   rb   rM   r]   )	r$   rN   rn   rO   re   rf   rV   Zmingwdirrh   r   r   r   ri   Z  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|v rn| d¡}| |d d¡ | |d d¡ | j}|r†|jdkr†g S |S )	Nr?   rl   r
   rj   rk   r   ZmingwexZmingw32)	r   rq   r   r   Úremovern   ro   rš   Úinsert)r$   rN   rn   Úir   r   r   rq   m  s    




zGnu95FCompiler.get_librariesc              	   C   sz   z<t j| jdg t jt jd}| ¡ \}}|p0d|p6d }W n tt jfyT   Y n"0 t|ƒ}t 	|¡}|rv| 
d¡S dS )Nz-v)ÚstdinÚstderró    r   Ú )rR   r   r4   r   ÚcommunicaterT   rU   r   ÚTARGET_Rr    r!   )r$   ÚpÚstdoutr§   rX   r&   r   r   r   r¢     s    
ý

zGnu95FCompiler.get_targetc              	   C   sz   t  ¡ }|D ]J}t|dƒ,}| d¡}|s,q8| |¡ qW d   ƒ q1 sL0    Y  qt | ¡ ¡}| d¡}| 	d¡S )NÚrbi   Úasciiú=)
ÚhashlibÚsha1ÚopenÚreadÚupdateÚbase64Ú	b32encodeÚdigestÚdecodeÚrstrip)r$   Ú	filenamesÚhÚfnrp   Ú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
        rj   zThis method only supports MSVCZ	win_amd64r
   r_   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:)rn   ro   r#   rÀ   Úlistr   rD   rV   ÚsplitextÚbasenamera   rm   Zlink_shared_objectZinitializedZ
initializeÚspawnr_   )r$   ÚobjectsrÃ   Úextra_dll_dirÚchained_dllsÚ
is_archivern   Zobject_hashÚtagrÆ   Z	root_nameZdll_nameZdef_nameZlib_nameZdll_pathZdef_pathÚlib_pathÚ	specifierZlib_argsr   r   r   Ú_link_wrapper_libž  s`    
ÿÿÿÿúüz Gnu95FCompiler._link_wrapper_libc                 C   s
   |j dvS )N)rj   )ro   )r$   Úcompilerr   r   r   Úcan_ccompiler_linkÜ  s    z!Gnu95FCompiler.can_ccompiler_linkc                 C   sÆ   | j jdkrºg }g }|D ](}| ¡  d¡r6| |¡ q| |¡ qg }g }|ddd… D ]6}	| j|	g|||dd\}
}| d|
¡ | d|¡ qX|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.
        rj   z.aNéÿÿÿÿT)rÊ   rË   r   FzUnsupported C compiler)rn   ro   ÚlowerÚendswithrM   rÏ   r¤   r#   )r$   rÈ   rÃ   rÉ   ZarchivesZplain_objectsÚobjZchained_libsrÊ   Úarchiver_   Údllr   r   r   Úwrap_unlinkable_objectsà  s<    û
û

z&Gnu95FCompiler.wrap_unlinkable_objects)r‡   rˆ   r‰   ro   rŠ   r‹   r*   rŒ   r   rŽ   r   r   r   r   rM   r   r‘   r=   r   rŸ   rQ   ri   rq   r¢   rÀ   rÏ   rÑ   rØ   r   r   r   r   r	   
  s@   õ>c              	   C   sÚ   | dd… }t jdd\}}t |¡ z¢tj |¡}tj |¡d d }zZ| d|d|g¡ t|t	t
|d}| ¡  |jdkW tj |¡r”t |¡ W t |¡ S ntj |¡rºt |¡ 0 W t |¡ nt |¡ 0 dS )	z7Return true if the architecture supports the -arch flagNz.f)Úsuffixr   z.orw   z-c)r§   r­   Úcwd)ÚtempfileÚmkstemprD   ÚcloserV   rW   rÅ   rL   r   r   r   rª   Ú
returncoderb   r£   )rœ   r~   ZnewcmdZfidÚfilenamere   rX   r¬   r   r   r   r›     s*    


ý
û ÿr›   Ú__main__)Úlog)Úcustomized_fcompilerrA   r   Zg95)#r   rD   r   rI   r   rÛ   r±   r¶   rR   r   r   r   Znumpy.distutils.exec_commandr   Znumpy.distutils.fcompilerr   Zdistutils.versionr   Z	compilersrz   r«   r   r   r	   r›   r‡   Ú	distutilsrá   Znumpy.distutilsrâ   Úset_verbosityÚprintrt   Ú	ExceptionÚer   r   r   r   Ú<module>   s<   
 q  

