o
    ʩZh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rd 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   T/var/www/html/lang_env/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n|| 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.aNT)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  
