o
    p‘>e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r¡d dlmZ d dlmZ e d¡ eedƒ  ¡ ƒ zeedƒ  ¡ ƒ W dS  e!y  Z" zee"ƒ W Y dZ"["dS dZ"["ww 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   ú^/home/www/facesmatcher.com/pyenv/lib/python3.10/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r=ejdkr=dgZejdkrNdD ]	Ze	e  d¡ qDd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…  ¡ }|  d¡st|ƒdkr?t d|¡}|r>|  d¡r1d| d¡fS | ¡ d	kr>d
| d¡fS n3t d|¡}|rNd
| d¡fS t d|¡}|rr| d¡}|  d¡sj|  d¡sj|  d¡rnd|fS d
|fS d}t|| ƒ‚)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   s2   
ÿ
ÿ
€ÿ
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_soZarchiverr1   Ú
linker_exeÚntÚcygwinz-fPICr
   )r3   r4   r7   r8   ú-mno-cygwinÚg2cÚgnu95c                 C   sž   | j dd … }tjdkr=tj dd ¡}|s5dd l}| d¡}|s.d}d|› }tj	|dd t
|ƒtjd< | g d	¢¡ n| d
¡ tj d¡rM| 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ÚtargetrF   Úsr   r   r   Úget_flags_linker_som   s    




z GnuFCompiler.get_flags_linker_soc              	   C   sF   zt  | jdg ¡}W n tt jfy   Y d S w t|ƒ}tj |¡S )Nz-print-libgcc-file-name)	Ú
subprocessÚcheck_outputr4   ÚOSErrorÚCalledProcessErrorr   rC   Ú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 }|rBd |¡g}z
t | j| ¡}W n ttjfy7   Y |S w t|ƒ}t	j
 |¡}|S )Né   Úlinuxzlibgfortran.sor>   zlibgfortran.dylibz-print-file-name={0})r   r   ÚformatrQ   rR   r4   rS   rT   r   rC   rU   rV   )r$   Zlibgfortran_nameZlibgfortran_dirZfind_lib_argrW   r   r   r   Úget_libgfortran_dir›   s&   
ÿûz GnuFCompiler.get_libgfortran_dirc                 C   sâ   g }t jd d… dkrd|  ¡ }|rdt 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_| |¡ | |¡ |  ¡ }|ro| |¡ |S )NrY   rZ   r
   z/usr/libzlib%s.aé   Úlib)r   r   rX   r   rC   rU   ÚnormpathÚjoinr<   ÚexistsÚpardirÚabspathrL   r\   )r$   rM   ÚdrU   ÚrootZd2Úlib_gfortran_dirr   r   r   Úget_library_dirs°   s$   


zGnuFCompiler.get_library_dirsc                 C   s¤   g }|   ¡ }|d ur&| jd }| j|| jf }tj tj ||¡¡s%| j}n| j}|d ur2| |¡ | j	}t
jdkrF|rF|jdkrF| d¡ t
jdkrP| d¡ |S )Nz-picr
   ÚmsvcÚgccr>   Ú
cc_dynamic)rX   r<   Zstatic_lib_formatZstatic_lib_extensionrC   rU   Úisfiler`   rL   Ú
c_compilerr   r   Úcompiler_type)r$   rM   rd   r<   Úfrl   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_versionrL   )r$   r'   rM   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 w t d¡}g }| |¡D ]}|d|g7 }q$|S )z( Return detected arch flags from CFLAGS r   NÚCFLAGSz-arch\s+(\w+)ú-arch)rF   Úget_config_varsÚKeyErrorr   ÚcompileÚfindall)r$   rF   ZcflagsZarch_reÚ
arch_flagsÚarchr   r   r   Ú_c_arch_flagsé   s   ÿ
zGnuFCompiler._c_arch_flagsc                 C   s   g S )Nr   rp   r   r   r   Úget_flags_archö   s   zGnuFCompiler.get_flags_archc                 C   sX   t jdks
t jdkrt‚d|vsJ ‚t jdkrd|› S t j d¡r'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__rm   Úcompiler_aliasesÚdescriptionr)   r*   Úpossible_executablesÚexecutablesÚmodule_dir_switchÚmodule_include_switchrC   Únamer   r   Z	pic_flagsÚkeyrL   r<   Zsuggested_f90_compilerrP   rX   r\   rg   ro   rq   rs   r|   r}   rƒ   r   r   r   r   r      sF    -ø

#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¡rUed  d¡ e ¡ d dd… dkrUdD ]	Zee  d¡ qKd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r	 |S tjdkr.dD ]
}| j|  d¡ q#|S )Nr   r   r   Ú4r
   )r3   r4   r5   r6   r7   r8   r;   )r)   r   r   r   rŠ   rL   )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   r@   Z64)r4   r5   r6   r7   r8   z-maix64c                 C   s^   t jdksg S g }|  ¡ }d|v rd|| d¡< dD ]}t||ƒr,||v r,| d|g¡ q|S )z>Return a list of -arch flags for every supported architecture.r>   Úi386Úi686)Úppcr’   Úx86_64Úppc64Ús390xru   )r   r   r|   ÚindexÚ_can_targetrK   )r$   Úcmdrz   Zc_archsr{   r   r   r   Ú_universal_flags<  s   
€zGnu95FCompiler._universal_flagsc                 C   ó*   t  | ¡}|  | j¡}|r||d d…< |S ©Nr   )r   Ú	get_flagsrš   r5   ©r$   Úflagsrz   r   r   r   r   L  ó
   
zGnu95FCompiler.get_flagsc                 C   r›   rœ   )r   rP   rš   r7   rž   r   r   r   rP   S  r    z"Gnu95FCompiler.get_flags_linker_soc           	      C   s´   t  | ¡}tjdkrM| j}|rM|jdkrM|  ¡ }|rMtj 	|  
¡ ¡}tjj|gtjfd ¢R Ž }tj |d¡}tj 	|¡}tj tj |d¡¡rM| |¡ |  ¡ }|rX| |¡ |S )Nr
   rh   r]   r^   zlibmingwex.a)r   rg   r   r   rl   rm   Ú
get_targetrC   rU   r_   rX   r`   rb   ra   rL   r\   )	r$   rM   rl   rN   rd   re   rU   Zmingwdirrf   r   r   r   rg   Z  s    



zGnu95FCompiler.get_library_dirsc                 C   sŒ   t  | ¡}tjdkr| d¡ tjdkrD| j}|r7|jdkr7d|v r7| d¡}| |d d¡ | |d d¡ | j}|rC|jdkrCg S 	 |S )	Nr>   rj   r
   rh   ri   r   ZmingwexZmingw32)	r   ro   r   r   Úremoverl   rm   r—   Úinsert)r$   rM   rl   Úir   r   r   ro   m  s   




zGnu95FCompiler.get_librariesc              	   C   s|   zt j| jdg t jt jd}| ¡ \}}|pd|pd }W n tt jfy+   Y dS w t|ƒ}t 	|¡}|r<| 
d¡S dS )Nz-v)ÚstdinÚstderró    r   Ú )rQ   r   r4   r   ÚcommunicaterS   rT   r   ÚTARGET_Rr    r!   )r$   ÚpÚstdoutr¦   rW   r&   r   r   r   r¡     s"   
ýù

zGnu95FCompiler.get_targetc              	   C   s|   t  ¡ }|D ]&}t|dƒ}	 | d¡}|sq| |¡ qW d   ƒ n1 s'w   Y  qt | ¡ ¡}| d¡}| 	d¡S )NÚrbTi   Úasciiú=)
ÚhashlibÚsha1ÚopenÚreadÚupdateÚbase64Ú	b32encodeÚdigestÚdecodeÚrstrip)r$   Ú	filenamesÚhÚfnrn   Ú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 |¡rh||fS |rtdgt|ƒ dg }| j|||t|ƒdd| ddddg d tƒ rd}nd}d| d| |g}|js¡| ¡  | |jg| ¡ ||fS )zeCreate a wrapper shared library for the given objects

        Return an MSVC-compatible lib
        rh   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:)rl   rm   r#   r¿   Úlistr   rC   rU   ÚsplitextÚbasenamer`   rk   Zlink_shared_objectZinitializedZ
initializeZspawnr^   )r$   ÚobjectsrÂ   Úextra_dll_dirÚchained_dllsÚ
is_archiverl   Zobject_hashÚtagrÅ   Z	root_nameZdll_nameZdef_nameZlib_nameZdll_pathZdef_pathZlib_pathÚ	specifierZlib_argsr   r   r   Ú_link_wrapper_libž  s`   
ÿÿÿÿúüz Gnu95FCompiler._link_wrapper_libc                 C   s
   |j dvS )N)rh   )rm   )r$   Úcompilerr   r   r   Úcan_ccompiler_linkÜ  s   
z!Gnu95FCompiler.can_ccompiler_linkc                 C   sÂ   | j jdkr]g }g }|D ]}| ¡  d¡r| |¡ q| |¡ qg }g }|ddd… D ]}	| j|	g|||dd\}
}| d|
¡ | d|¡ q,|sL|S | j||||dd\}
}|
g| S td	ƒ‚)
z†
        Convert a set of object files that are not compatible with the default
        linker, to a file that is compatible.
        rh   z.aNéÿÿÿÿT)rÈ   rÉ   r   FzUnsupported C compiler)rl   rm   ÚlowerÚendswithrL   rÌ   r£   r#   )r$   rÆ   rÂ   rÇ   ZarchivesZplain_objectsÚobjZchained_libsrÈ   Úarchiver^   Zdllr   r   r   Úwrap_unlinkable_objectsà  s<   
û
û
z&Gnu95FCompiler.wrap_unlinkable_objects)r„   r…   r†   rm   r‡   rˆ   r*   r‰   rŠ   r‹   rŒ   r   r   r   rL   r   rŽ   r<   rš   r   rP   rg   ro   r¡   r¿   rÌ   rÎ   rÔ   r   r   r   r   r	   
  sB    õ>c              	   C   sÖ   | dd… }t jdd\}}t |¡ zQtj |¡}tj |¡d d }z3| d|d|g¡ t|t	t
|d}| ¡  |jdkW tj |¡rQt |¡ W t |¡ S W t |¡ S tj |¡rdt |¡ w w t |¡ w )	z7Return true if the architecture supports the -arch flagNz.f)Úsuffixr   z.oru   z-c)r¦   r¬   Úcwd)ÚtempfileÚmkstemprC   ÚcloserU   rV   rÄ   rK   r   r   r   r©   Ú
returncodera   r¢   )r™   r{   ZnewcmdZfidÚfilenamerd   rW   r«   r   r   r   r˜     s(   

ýýÿr˜   Ú__main__)Úlog)Úcustomized_fcompilerr@   r   Zg95)#r   rC   r   rH   r   r×   r°   rµ   rQ   r   r   r   Znumpy.distutils.exec_commandr   Znumpy.distutils.fcompilerr   Zdistutils.versionr   Z	compilersrx   rª   r   r   r	   r˜   r„   Ú	distutilsrÝ   Znumpy.distutilsrÞ   Zset_verbosityÚprintrr   Ú	ExceptionÚer   r   r   r   Ú<module>   sD    
 q  
€ÿø