o
    $حc7Q                  
   @   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   Z64bit)sysplatformarchitecture r   r   =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archiverr0   
linker_exentcygwinz-fPICr
   )r2   r3   r6   r7   -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   darwinZMACOSX_DEPLOYMENT_TARGETr   z10.9z.Env. variable MACOSX_DEPLOYMENT_TARGET set to    )
stacklevel)z
-undefinedZdynamic_lookupz-bundlez-sharedZsunosz-mimpure-text)r6   r   r   osenvironget	sysconfigZget_config_varwarningswarnstrextendappendr   )r#   opttargetrC   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_outputr3   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 }|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   formatrM   rN   r3   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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 )NrU   rV   r
   z/usr/libzlib%s.a   lib)r   r   rT   r   r@   rQ   normpathjoinr;   existspardirabspathrH   rX   )r#   rI   drQ   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)rT   r;   Zstatic_lib_formatZstatic_lib_extensionr@   rQ   isfiler\   rH   
c_compilerr   r   compiler_type)r#   rI   r`   r;   frh   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_versionrH   )r#   r&   rI   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   NZCFLAGSz-arch\s+(\w+)-arch)rC   Zget_config_varsKeyErrorr   compilefindall)r#   rC   ZcflagsZarch_re
arch_flagsarchr   r   r   _c_arch_flags   s   
zGnuFCompiler._c_arch_flagsc                 C   s   g S )Nr   rl   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
   r9   ,r=   z-Wl,-rpath,Z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__ri   compiler_aliasesdescriptionr(   r)   possible_executablesexecutablesmodule_dir_switchmodule_include_switchr@   namer   r   Z	pic_flagskeyrH   r;   Zsuggested_f90_compilerrL   rT   rX   rc   rk   rm   ro   rv   rw   r|   r   r   r   r   r      sF    -

#c                	   @   sR  e Zd ZdZdZdZdd Zg Ze	dZ
e
dur"eeje
 edd	g e	dr:eeje	d 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 qsd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 d0d1 Z!dS )2r	   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
   )r2   r3   r4   r5   r6   r7   r:   )r(   r   r   r   r   rH   )r#   r$   r&   r   r   r   r   r)     s   


zGnu95FCompiler.version_matchZGFORTRANNr   Zf95<F90>r*   )Nr,   r+   z-ffixed-formr-   )Nr,   r+   r-   )r   r,   r+   r.   r/   r0   r,   r1   z-Jz-Iry   r6   z	-lpthreadr   r>   Z64)r3   r4   r5   r6   r7   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=   Zi386i686)Zppcr   Zx86_64Zppc64Zs390xrp   )r   r   rv   index_can_targetrG   )r#   cmdrt   Zc_archsru   r   r   r   _universal_flagsC  s   
zGnu95FCompiler._universal_flagsc                 C   *   t | }| | j}|r||d d< |S Nr   )r   	get_flagsr   r4   r#   flagsrt   r   r   r   r   S  
   
zGnu95FCompiler.get_flagsc                 C   r   r   )r   rL   r   r6   r   r   r   r   rL   Z  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
   rd   rY   rZ   zlibmingwex.a)r   rc   r   r   rh   ri   
get_targetr@   rQ   r[   rT   r\   r^   r]   rH   rX   )	r#   rI   rh   rJ   r`   ra   rQ   Zmingwdirrb   r   r   r   rc   a  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=   rf   r
   rd   re   r   ZmingwexZmingw32)	r   rk   r   r   removerh   ri   r   insert)r#   rI   rh   ir   r   r   rk   t  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    )rM   r   r3   r   communicaterO   rP   r   TARGET_Rr   r    )r#   pstdoutr   rS   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=)
hashlibZsha1openreadupdatebase64Z	b32encodeZdigest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|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
        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  s`   
z Gnu95FCompiler._link_wrapper_libc                 C   s
   |j dv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 }|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.
        rd   z.aNT)r   r   r   FzUnsupported C compiler)rh   ri   lowerendswithrH   r   r   r"   )r#   r   r   r   ZarchivesZplain_objectsobjZchained_libsr   archiverZ   Zdllr   r   r   wrap_unlinkable_objects  s<   


z&Gnu95FCompiler.wrap_unlinkable_objects)"r}   r~   r   ri   r   r   r)   r   r@   getenvZ_env_gfortranrH   rQ   r   rG   r   r   r   r   r   r   r   r   r;   r   r   rL   rc   rk   r   r   r   r   r   r   r   r   r   r	   
  sN    

>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.orp   z-c)r   r   cwd)tempfileZmkstempr@   closerQ   rR   r   rG   r   r   r   r   
returncoder]   r   )r   ru   ZnewcmdZfidfilenamer`   rS   r   r   r   r   r     s(   

r   __main__)log)customized_fcompilerr>   r   Zg95)#r   r@   r   rD   r   r   r   r   rM   r   r   r   Znumpy.distutils.exec_commandr   Znumpy.distutils.fcompilerr   Zdistutils.versionr   Z	compilersrr   r   r   r   r	   r   r}   Z	distutilsr   Znumpy.distutilsr   Zset_verbosityprintrn   	Exceptioner   r   r   r   <module>   sD    
 q  
