
    G/PhP                        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 j        d          Zd	 Z G d
 de          Z G d de          Zd Zedk    rd dlmZ d dlmZ  ej        d            e ed                                                      	  e ed                                                      dS # e!$ rZ" ee"           Y dZ"["dS dZ"["ww xY wdS )    N)PopenPIPESTDOUT)filepath_from_subprocess_output)	FCompiler)LooseVersionGnuFCompilerGnu95FCompilerzTarget: ([a-zA-Z0-9_\-]*)c                  \    t           j        dk    ot          j                    d         dk    S )Nwin32r   64bit)sysplatformarchitecture     ]/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/numpy/distutils/fcompiler/gnu.pyis_win64r      s'    <7"Lx'<'>'>q'AW'LLr   c            	       .   e Zd ZdZdZdZd Z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    r dD ]Ze	e                             d           dZdZd Zd Zd Zd Zd Zd Zd Zd Zd  Zd! ZdS )"r	   gnu)g77zGNU Fortran 77 compilerc                 0   |                     d          rG||                    d          dz   d                                         }|                     d          Gt          |          dk    rst	          j        d|          }|r[|                     d          rd|                    d          fS |                                d	k    rd
|                    d          fS nt	          j        d|          }|rd
|                    d          fS t	          j        d|          }|r\|                    d          }|                     d          s*|                     d          s|                     d          rd|fS d
|fS d}t          ||z             )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errs        r   gnu_version_matchzGnuFCompiler.gnu_version_match   s    ''(;<< 	G~224881<==>DDFF  ''(;<< 	G ~"$$	,77A 	4 ",,];; 4!1771::.. WWYY!^^&

33 	:NKKA 0"AGGAJJ//	8.J JA +GGAJJ<<$$ +S(9(9 +Q\\#=N=N +!1:% '?* H~-...r   c                 \    |                      |          }|r|d         dk    rd S |d         S )Nr   r   r   )r.   )r)   r*   r,   s      r   version_matchzGnuFCompiler.version_matchL   s7    "">22 	AaDEMM4tr   r   f77N-dumpversion)N-g-Wall-fno-second-underscore)Nr3   r4   ar-crranlibversion_cmdcompiler_f77compiler_f90compiler_fix	linker_soarchiverr8   
linker_exentcygwinz-fPICr   )r:   r;   r>   r@   -mno-cygwing2cgnu95c                    | j         dd          }t          j        dk    rt          j                            dd           }|sTdd l}|                    d          }|sd}d| }t          j	        |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
-undefineddynamic_lookupz-bundlez-sharedsunosz-mimpure-text)r>   r   r   osenvironget	sysconfigget_config_varwarningswarnstrextendappendr    )r)   opttargetrP   ss        r   get_flags_linker_soz GnuFCompiler.get_flags_linker_som   s   nQRR <8##Z^^$>EEF  E !   "112LMM 3#FQQQAM!22229<V
56JJBBBCCCCJJy!!!<""7++ 	( JJ'''
r   c                     	 t          j        | j        dgz             }t          |          }t          j                            |          S # t          t           j        f$ r Y nw xY wd S )Nz-print-libgcc-file-name)	
subprocesscheck_outputr;   r   rM   pathdirnameOSErrorCalledProcessError)r)   outputs     r   get_libgcc_dirzGnuFCompiler.get_libgcc_dir   s    	+,T->-F,G.H I IF
 5V<<F7??6***	 67 	 	 	D	
 ts   A A&%A&c                 j   t           j        d d         dk    rd}nt           j        dk    rd}nd }d }|r~d                    |          g}	 t          j        | j        |z             }t          |          }t          j        	                    |          }n# t          t          j        f$ r Y nw xY w|S )N   linuxzlibgfortran.sorG   zlibgfortran.dylibz-print-file-name={0})r   r   formatr\   r]   r;   r   rM   r^   r_   r`   ra   )r)   libgfortran_namelibgfortran_dirfind_lib_argrb   s        r   get_libgfortran_dirz GnuFCompiler.get_libgfortran_dir   s    <w&&/\X%%2# 		:299:JKKLL:#0'+'8<'GI I
 9@@"$'//&"9"9	 Z:;   
 s   B B0/B0c                    g }t           j        d d         dk    rw|                                 }|r`t           j        dk    r:|                    d          s$t          j                            |          }t          j                            |d| j        z            }t          j        	                    |          st	          j        j        |gt          j
        fdz  R  }t          j                            t          j                            |d                    }t          j                            |d| j        z            }t          j        	                    |          r|                    |           |                    |           |                                 }|r|                    |           |S )Nre   rf   r   z/usr/libzlib%s.a   lib)r   r   rc   r    rM   r^   normpathjoinrD   existspardirabspathrV   rk   )r)   rW   dr^   rootd2lib_gfortran_dirs          r   get_library_dirszGnuFCompiler.get_library_dirs   sb   <w&&##%%A <7**1<<
3K3K*((++A7<<9tx+?@@D7>>$// +!w|AD")1BDDDW__RW\\$-F-FGG!w||B	DH0DEE7>>$// +JJrNNN

13355 	)JJ'(((
r   c                    g }|                                  }|`| j        dz   }| j        || j        fz  }t          j                            t          j                            ||                    s| j        }n| j        }||                    |           | j	        }t          j        dk    r"|r |j        dk    r|                    d           t          j        dk    r|                    d           |S )Nz-picr   msvcgccrG   
cc_dynamic)rc   rD   static_lib_formatstatic_lib_extensionrM   r^   isfilerp   rV   
c_compilerr   r   compiler_type)r)   rW   rt   rD   fr   s         r   get_librarieszGnuFCompiler.get_libraries   s    !!=(V#C&#t/H)IIA7>>"',,q!"4"455 h(C?JJsOOO_
<7""z"(F22JJu<8##JJ|$$$
r   c                     dgS )Nr3   r   r)   s    r   get_flags_debugzGnuFCompiler.get_flags_debug   s	    vr   c                 v    |                                  }|r
|dk    rdg}ndg}|                    d           |S )Nz3.3.3z-O2z-O3z-funroll-loops)get_versionrV   )r)   r,   rW   s      r   get_flags_optzGnuFCompiler.get_flags_opt   sM     	g 'CC'C

#$$$
r   c                     ddl }	 |                                d         }n# t          $ r g cY S w xY wt          j        d          }g }|                    |          D ]	}|d|gz  }
|S )z( Return detected arch flags from CFLAGS r   NCFLAGSz-arch\s+(\w+)-arch)rP   get_config_varsKeyErrorr$   compilefindall)r)   rP   cflagsarch_re
arch_flagsarchs         r   _c_arch_flagszGnuFCompiler._c_arch_flags   s    	..00:FF 	 	 	III	*-..
OOF++ 	* 	*D7D/)JJs   ! 00c                     g S )Nr   r   s    r   get_flags_archzGnuFCompiler.get_flags_arch   s    	r   c                     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   rB   ,rG   z-Wl,-rpath,aixos400z-Wl,-blibpath:z-Wl,-rpath=)r   r   NotImplementedErrorr    )r)   dirs     r   runtime_library_dir_optionz'GnuFCompiler.runtime_library_dir_option   s    <7""clh&>&>%% #~~~~<8##&&&&\$$%566 	')C)))&&&&r   )__name__
__module____qualname__r   compiler_aliasesdescriptionr.   r0   possible_executablesexecutablesmodule_dir_switchmodule_include_switchrM   namer   r   	pic_flagskeyrV   rD   suggested_f90_compilerrZ   rc   rk   rx   r   r   r   r   r   r   r   r   r   r	   r	      s       M +K+/ +/ +/Z   "5>/HHH..."...	 	K   
w$3<833I	 |wM 	3 	3C##M2222
C$! ! !F	 	 	  *  ,  *  	 	 	    ' ' ' ' 'r   c            	          e Zd ZdZdZdZ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j                    d         dd         dk    r dD ]Zee                             d           dZd Zd Zd Zd Zd  Zd! Zd" Zd# Zd$ Zd% ZdS )&r
   rE   )r   zGNU Fortran 95 compilerc                     |                      |          }|r|d         dk    rd S |d         }t          |          dk    rn5t          j        dk    r%dD ]"}| j        |                             d           #|S )Nr   r   r   4r   )r:   r;   r<   r=   r>   r@   rC   )r.   r   r   r   r   rV   )r)   r*   r,   r   s       r   r0   zGnu95FCompiler.version_match  s    "">22 	AaDJ&&4aD??c!! |w&& @ @C $S)00????r   r   f95<F90>r2   )Nr4   r3   z-ffixed-formr5   )Nr4   r3   r5   )r   r4   r3   r6   r7   r8   Nr4   r9   z-Jz-Ir   r>   z	-lpthreadr   rI   64)r;   r<   r=   r>   r@   z-maix64c                     t           j        dk    sg S g }|                                 }d|v rd||                    d          <   dD ]-}t	          ||          r||v r|                    d|g           .|S )z>Return a list of -arch flags for every supported architecture.rG   i386i686)ppcr   x86_64ppc64s390xr   )r   r   r   index_can_targetrU   )r)   cmdr   c_archsr   s        r   _universal_flagszGnu95FCompiler._universal_flags<  s    |x''I
$$&&W-3GGMM&))* @ 	3 	3D3%% 3$'//!!7D/222r   c                     t                               |           }|                     | j                  }|r||d d<   |S Nr   )r	   	get_flagsr   r<   r)   flagsr   s      r   r   zGnu95FCompiler.get_flagsL  sE    &&t,,**4+<==
 	#"E"1"Ir   c                     t                               |           }|                     | j                  }|r||d d<   |S r   )r	   rZ   r   r>   r   s      r   rZ   z"Gnu95FCompiler.get_flags_linker_soS  sD    0066**4>::
 	#"E"1"Ir   c                    t                               |           }t          j        dk    r| j        }|r|j        dk    r|                                 }|rt          j        	                    | 
                                          }t          j        j        |gt          j        fdz  R  }t          j                            |d          }t          j        	                    |          }t          j                            t          j                            |d                    r|                    |           |                                 }|r|                    |           |S )Nr   rz   rm   rn   zlibmingwex.a)r	   rx   r   r   r   r   
get_targetrM   r^   ro   rc   rp   rr   rq   rV   rk   )	r)   rW   r   rX   rt   ru   r^   mingwdirrw   s	            r   rx   zGnu95FCompiler.get_library_dirsZ  s,   ++D11<7""J -j6&@@** -(()<)<)>)>??A7<@bi]Q->@@@D7<<e44D!w//55Hw~~bgll8^&L&LMM -

8,,,3355 	)JJ'(((
r   c                    t                               |           }t          j        dk    r|                    d           t          j        dk    rv| j        }|rV|j        dk    rKd|v rG|                    d          }|                    |dz   d           |                    |dz   d           | j        }|r|j        dk    rg S 	 |S )	NrG   r|   r   rz   r{   r   mingwexmingw32)	r	   r   r   r   remover   r   r   insert)r)   rW   r   is       r   r   zGnu95FCompiler.get_librariesm  s    ((..<8##JJ|$$$<7""J 1j6&@@C<<		%((AJJq1ui000JJq1ui000J j6&@@	
r   c                 j   	 t          j        | j        dgz   t           j        t           j                  }|                                \  }}|pd|pdz   }t          |          }t                              |          }|r|                    d          S n# t          t           j
        f$ r Y nw xY wdS )Nz-v)stdinstderrr   r    )r\   r   r;   r   communicater   TARGET_Rr%   r&   r`   ra   )r)   pstdoutr   rb   r+   s         r   r   zGnu95FCompiler.get_target  s    	" !TF* o!  A
 ]]__NFFm#6F 5V<<F''A "wwqzz!" 67 	 	 	D	 rs   AB B0/B0c                    t          j                    }|D ]Z}t          |d          5 }	 |                    d          }|sn|                    |           .	 d d d            n# 1 swxY w Y   [t          j        |                                          }|                    d          }|	                    d          S )NrbTi   ascii=)
hashlibsha1openreadupdatebase64	b32encodedigestdecoderstrip)r)   	filenameshfnr   blocktexts          r   _hash_fileszGnu95FCompiler._hash_files  s    LNN 	$ 	$Bb$ $1$FF6NNE  HHUOOO	$ 	$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 

++{{7##{{3s   0A%%A)	,A)	c                     | j         }|j        dk    rt          d          |                     t	          |          t	          |          z             }t                      rd}nd}dt          j                            t          j        	                    |d                             d         dd         z   }	|	d	z   |z   d
z   |z   }
|
dz   }|
dz   }|
dz   }t          j        
                    ||          }t          j        
                    ||          }t          j        
                    ||          }t          j                            |          r||fS |rdgt	          |          z   dgz   }|                     |||t	          |          dd|z   ddddgz              t                      rd}nd}d|z   d|z   |g}|j        s|                                 |                    |j        g|z              ||fS )zeCreate a wrapper shared library for the given objects

        Return an MSVC-compatible lib
        rz   zThis method only supports MSVC	win_amd64r   rn   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:)r   r   r(   r   listr   rM   r^   splitextbasenamerp   r   link_shared_objectinitialized
initializespawnrn   )r)   objectsr   extra_dll_dirchained_dlls
is_archiver   object_hashtagr   	root_namedll_namedef_namelib_namedll_pathdef_pathlib_path	specifierlib_argss                      r   _link_wrapper_libz Gnu95FCompiler._link_wrapper_lib  s5    _
#v--=>>>&&tG}}tL7I7I'IJJ:: 	CCC27++GWQZ((* **+--/aR1 1sN[0<?#E	v%v%v%7<<x887<<
H557<<
H557>>(## 	&X%% 	3-.g>012G$--1#h.**"1 	 	  	 	 	 :: 	'&II&I h&((:IF% 	$!!###*.)H4555!!r   c                     |j         dvS )N)rz   )r   )r)   compilers     r   can_ccompiler_linkz!Gnu95FCompiler.can_ccompiler_link  s    %Z77r   c                    | j         j        dk    rg }g }|D ]T}|                                                    d          r|                    |           ?|                    |           Ug }g }|ddd         D ]L}	|                     |	g|||d          \  }
}|                    d|
           |                    d|           M|s|S |                     ||||d          \  }
}|
g|z   S t          d	          )
z
        Convert a set of object files that are not compatible with the default
        linker, to a file that is compatible.
        rz   z.aNT)r   r   r   FzUnsupported C compiler)r   r   lowerendswithrV   r  r   r(   )r)   r   r   r   archivesplain_objectsobjchained_libsr   archivern   dlls               r   wrap_unlinkable_objectsz&Gnu95FCompiler.wrap_unlinkable_objects  sU   
 ?(F22 HM . .99;;''-- .OOC((((!((----LL#DDbD> , ,11I!!-# 2 % %S ##As+++##As++++  $##--)  . " "HC 5<''5666r   )r   r   r   r   r   r   r0   r   r   r   r   r   r   r    rV   r   r   rD   r   r   rZ   rx   r   r   r   r  r	  r  r   r   r   r
   r
   
  s       M%+K  & '.!>24 4 44 4 44 4 4111" K  
|/00 3K ''444 8 ""1%bqb)T11` 3 3C ''	2222
C         &  $  $     <" <" <"|8 8 8+7 +7 +7 +7 +7r   c                    | dd         }t          j        d          \  }}t          j        |           	 t          j                            |          }t          j                            |          d         dz   }	 |                    d|d|g           t          |t          t          |          }|                                 |j        dk    t          j                            |          rt          j        |           t          j        |           S # t          j                            |          rt          j        |           w w xY w# t          j        |           w xY w)	z7Return true if the architecture supports the -arch flagNz.f)suffixr   z.or   z-c)r   r   cwd)tempfilemkstemprM   closer^   r_   r   rU   r   r   r   r   
returncoderq   r   )r   r   newcmdfidfilenamert   rb   r   s           r   r   r     s=   VF$D111MCHSMMMGOOH%%!!(++A.5	"MM7D$9:::fVDa@@@AMMOOO<1$w~~f%% "	&!!!
	( w~~f%% "	&!!!!" 		(s%   AE  AD 3E 6EE E+__main__)log)customized_fcompilerrI   r   g95)#r$   rM   r   rR   r   r  r   r   r\   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   <module>r-     s0   				 				 



          * * * * * * * * * * H H H H H H / / / / / / * * * * * *-.	2:233
M M Mm' m' m' m' m'9 m' m' m'`A7 A7 A7 A7 A7\ A7 A7 A7H  ( z444444Ca	E

u
%
%
1
1
3
3444""5))557788888   a s    &C( (D-C>>D