o
    >~#g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   /var/www/static.ux5.de/https/Moving-Object-Detection-with-OpenCV/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   f77N-dumpversion)N-g-Wall-fno-second-underscore)Nr-   r.   ar-crranlibversion_cmdcompiler_f77compiler_f90compiler_fix	linker_soarchiverr2   
linker_exentcygwinz-fPICr
   )r4   r5   r8   r:   -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
-undefineddynamic_lookupz-bundlez-sharedsunosz-mimpure-text)r8   r   r   osenvironget	sysconfigget_config_varwarningswarnstrextendappendr   )r$   opttargetrI   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_outputr5   OSErrorCalledProcessErrorr   rF   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   formatrT   rU   r5   rV   rW   r   rF   rX   rY   )r$   libgfortran_namelibgfortran_dirfind_lib_argrZ   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 )Nr\   r]   r
   z/usr/libzlib%s.a   lib)r   r   r[   r   rF   rX   normpathjoinr>   existspardirabspathrO   rb   )r$   rP   drX   root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)r[   r>   static_lib_formatstatic_lib_extensionrF   rX   isfilerf   rO   
c_compilerr   r   compiler_type)r$   rP   rj   r>   fru   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_versionrO   )r$   r'   rP   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)rI   get_config_varsKeyErrorr   compilefindall)r$   rI   cflagsarch_re
arch_flagsarchr   r   r   _c_arch_flags   s   
zGnuFCompiler._c_arch_flagsc                 C   s   g S )Nr   ry   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,aix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__rv   compiler_aliasesdescriptionr)   r*   possible_executablesexecutablesmodule_dir_switchmodule_include_switchrF   namer   r   	pic_flagskeyrO   r>   suggested_f90_compilerrS   r[   rb   rn   rx   rz   r|   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
   )r4   r5   r6   r7   r8   r:   r=   )r)   r   r   r   r   rO   )r$   r%   r'   r   r   r   r   r*     s   


zGnu95FCompiler.version_matchr   f95<F90>r,   )Nr.   r-   z-ffixed-formr/   )Nr.   r-   r/   )r   r.   r-   r0   r1   r2   Nr.   r3   z-Jz-Ir   r8   z	-lpthreadr   rB   64)r5   r6   r7   r8   r:   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s390xr~   )r   r   r   index_can_targetrN   )r$   cmdr   c_archsr   r   r   r   _universal_flags<  s   
zGnu95FCompiler._universal_flagsc                 C   *   t | }| | j}|r||d d< |S Nr   )r   	get_flagsr   r6   r$   flagsr   r   r   r   r   L  
   
zGnu95FCompiler.get_flagsc                 C   r   r   )r   rS   r   r8   r   r   r   r   rS   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
   ro   rc   rd   zlibmingwex.a)r   rn   r   r   ru   rv   
get_targetrF   rX   re   r[   rf   rh   rg   rO   rb   )	r$   rP   ru   rQ   rj   rk   rX   mingwdirrm   r   r   r   rn   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@   rq   r
   ro   rp   r   mingwexmingw32)	r   rx   r   r   removeru   rv   r   insert)r$   rP   ru   ir   r   r   rx   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    )rT   r   r5   r   communicaterV   rW   r   TARGET_Rr    r!   )r$   pstdoutr   rZ   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fnrw   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
        ro   zThis method only supports MSVC	win_amd64r
   rd   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_dirextra_postargsz/MACHINE:X64z/MACHINE:X86z/def:z/OUT:)ru   rv   r#   r   listr   rF   rX   splitextbasenamerf   rt   link_shared_objectinitialized
initializespawnrd   )r$   objectsr   extra_dll_dirchained_dlls
is_archiveru   object_hashtagr   	root_namedll_namedef_namelib_namedll_pathdef_pathlib_path	specifierlib_argsr   r   r   _link_wrapper_lib  s`   
z Gnu95FCompiler._link_wrapper_libc                 C   s
   |j dvS )N)ro   )rv   )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.
        ro   z.aNT)r   r   r   FzUnsupported C compiler)ru   rv   lowerendswithrO   r   r   r#   )r$   r   r   r   archivesplain_objectsobjchained_libsr   archiverd   dllr   r   r   wrap_unlinkable_objects  s<   


z&Gnu95FCompiler.wrap_unlinkable_objects)r   r   r   rv   r   r   r*   r   r   r   r   r   r   r   rO   r   r   r>   r   r   rS   rn   rx   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.or~   z-c)r   r   cwd)tempfilemkstemprF   closerX   rY   r   rN   r   r   r   r   
returncoderg   r   )r   r   newcmdfidfilenamerj   rZ   r   r   r   r   r     s(   

r   __main__)log)customized_fcompilerrB   r   g95)#r   rF   r   rK   r   r   r   r   rT   r   r   r   numpy.distutils.exec_commandr   numpy.distutils.fcompilerr   distutils.versionr   	compilersr   r   r   r   r	   r   r   	distutilsr  numpy.distutilsr  set_verbosityprintr{   	Exceptioner   r   r   r   <module>   sD    
 q  
