
    g'                        d dl mZ d dlmZmZ d dlm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  G d d          Z G d	 d
e          Zd Z G d de          Z G d de          ZdS )    )annotations)CallableOptional)OrderedDictN   )find_binary_of_commandunique_listCompileErrorc                      e Zd ZU dZded<   ded<   dZded<   ded<   d	ed
<   ded<   ded<   	 	 	 ddZedd            Zd Z	d Z
dS )CompilerRunnera   CompilerRunner base class.

    Parameters
    ==========

    sources : list of str
        Paths to sources.
    out : str
    flags : iterable of str
        Compiler flags.
    run_linker : bool
    compiler_name_exe : (str, str) tuple
        Tuple of compiler name &  command to call.
    cwd : str
        Path of root of relative paths.
    include_dirs : list of str
        Include directories.
    libraries : list of str
        Libraries to link against.
    library_dirs : list of str
        Paths to search for shared libraries.
    std : str
        Standard string, e.g. ``'c++11'``, ``'c99'``, ``'f2003'``.
    define: iterable of strings
        macros to define
    undef : iterable of strings
        macros to undefine
    preferred_vendor : string
        name of preferred vendor e.g. 'gnu' or 'intel'

    Methods
    =======

    run():
        Invoke compilation as a subprocess.

    strenviron_key_compilerenviron_key_flagsLDFLAGSenviron_key_ldflagszdict[str, str]compiler_dictztuple[None | str, ...]	standardsz)dict[str, Callable[[Optional[str]], str]]std_formatercompiler_name_vendor_mappingNT.c           	     >	   t          |t                    rt          d          t          |          | _        || _        |pg | _        t          j        	                    | j
                  r7| xj        t          j        | j
                                                 z  c_        || _        |r|\  | _        | _        nst          j        	                    | j                  rt          j        | j                 | _        | j                                        D ]\  }}|| j        v r|| _        || _         n^t          | j                                                  d         \  | _        | _        t'          j        d| j        d| j                   n| t          j        	                    dd           }|                     |          \  | _        | _        | _        | j        Lt          d                    d                    | j                                                                      |pg | _        |pg | _        |pg | _        |pg | _        |	pg | _        |
p| j        d         | _        || _         | j         r)t          tC          d | j                            | _        n#d	| j        vr| j        "                    d	           | j        r8| j        "                     | j#        | j                 | j                             |pg d
 tI          t          j%        t          j        	                    | j&        d                                                    D             z   | _'        |,tQ          j)        d          }tQ          j)        d          }|du rltU          tI          |j+        |                    rtY          d          tU          tI          |j+        |                    rd S |"                    d           d S |du rltU          tI          |j+        |                    rd S tU          tI          |j+        |                    rtY          d          |"                    d           d S d}t          |                    |                    d S )Nz2Expected argument sources to be a list of strings.r   z*failed to determine what kind of compiler z is, assuming SYMPY_COMPILER_VENDORz No compiler found (searched: {})z, c                    | dk    S )N-c xs    `/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/utilities/_compilation/runners.py<lambda>z)CompilerRunner.__init__.<locals>.<lambda>o   s
    qDy     r   c                    g | ]
}|d k    |S ) r   ).0lfs     r   
<listcomp>z+CompilerRunner.__init__.<locals>.<listcomp>x   s(     , , ,22XX -/XXr    r"   zno-strict-aliasing$zstrict-aliasing$Tz4Strict aliasing cannot be both enforced and disabledz-fstrict-aliasingFz-fno-strict-aliasingz:Expected argument strict_aliasing to be True/False, got {})-
isinstancer   
ValueErrorlistsourcesoutflagsosenvirongetr   splitcwdcompiler_namecompiler_binaryr   r   itemscompiler_vendorwarningswarnfind_compilerformatjoinvaluesdefineundefinclude_dirs	librarieslibrary_dirsr   std
run_linkerfilterappendr   mapstripr   linklinerecompileanymatchr
   )selfr)   r*   r+   rA   compilerr0   r=   r>   r?   r@   r;   r<   strict_aliasingpreferred_vendorrF   kwargskvnsa_resa_remsgs                         r   __init__zCompilerRunner.__init__G   s    gs## 	SQRRRG}}[b
:>>$011 	EJJ"*T%;<BBDDDJJ 	t7?4D 4 4Z^^D566 	t#%:d.G#HD *0022 J J1,,,+,D()*D&E -
 <@@R@X@X@Z@Z;[;[\];^8$d&8#333T5G5GI J J J  '#%:>>2I4#P#P MQM_M_`pMqMqJD 4d6J#+ !C!J!J499UYUgUnUnUpUpKqKq!r!rsssl[b
(.B"b(.B+$.+$? 	(f%8%8$*EEFFDJJ4:%%
!!$'''8 	/J $d/"$$(H. . / / / "R , ,Irz~~d&>CCIIKK:
 :
 , , ,  &Z 566FJ122E$&&s6<//00 6&']^^^U[%0011 6DLL!455555 E))s6<//00 =D3u{E2233 =*+abbb%;<<<<<R O!<!<===) '&r    c                
    t           j                                                  }|r-||v r|g|z   }n"t          d                    |                    t           fd|D                       \  }}|| j        |         fS )z/ Identify a suitable C/fortran/other compiler. zUnknown vendor {}c                *    g | ]}j         |         S r   )r   )r#   r   clss     r   r%   z0CompilerRunner.find_compiler.<locals>.<listcomp>   s!    ,V,V,VaS->q-A,V,V,Vr    )r(   r   keysr'   r8   r   r   )rX   rN   
candidatesnamepaths   `    r   r7   zCompilerRunner.find_compiler   s     #+002233
 	O:--./
:

 !4!;!;<L!M!MNNN+,V,V,V,V:,V,V,VWW
dT3;DAAAr    c                   | j         g| j        z   d | j        D             z   d | j        D             z   d | j        D             z   | j        z   }| j        r.|d | j        D             d | j        D             z   | j	        z   z  }g }t          j        dd                    |                    D ]S}t          j        |          =||vr9|                    |           d	                    |          }t#          |          T|S )
zD List of arguments (str) to be passed to e.g. ``subprocess.Popen``. c                    g | ]}d |z   S )z-Ur   r#   r   s     r   r%   z&CompilerRunner.cmd.<locals>.<listcomp>   s    (((T!V(((r    c                    g | ]}d |z   S )z-Dr   r_   s     r   r%   z&CompilerRunner.cmd.<locals>.<listcomp>   s    )))T!V)))r    c                    g | ]}d |z   S )z-Ir   r_   s     r   r%   z&CompilerRunner.cmd.<locals>.<listcomp>   s    ///T!V///r    c                    g | ]}d |z   S )z-Lr   r_   s     r   r%   z&CompilerRunner.cmd.<locals>.<listcomp>   s    777T!V777r    c                    g | ]}d |z   S )z-lr   r_   s     r   r%   z&CompilerRunner.cmd.<locals>.<listcomp>   s    444T!V444r    z\$\{(\w+)\} Nz$Environment variable '{}' undefined.)r2   r+   r<   r;   r=   r)   rA   r?   r>   rF   rG   findallr9   r,   getenvrC   r8   r
   )rK   cmdcountedenvvarrT   s        r   rg   zCompilerRunner.cmd   sA    !"J((TZ((() *)T[)))* 0/T.///	0
 L 	 ? 	#77T%677744T^4445M" #C j#?? 	, 	,Fy  (((NN6***@GGOOC&s+++
r    c           	     r   t          | j                  | _        | j                            d| j        g           t          j                                        }| j        |d<   t          j	        d
                    |                                           d| j        t          j        t          j        t          j        |          }|                                }	 |d                             d          | _        n0# t"          $ r# |d                             d          | _        Y nw xY w|j        | _        | j        dk    rhd	                    d
                    |                                           | j        t+          | j                  | j                  }t-          |          | j        | j        fS )
Nz-oPWDrd   T)shellr0   stdinstdoutstderrenvr   zutf-8z
iso-8859-1z3Error executing '{}' in {} (exited status {}):
 {}
)r	   r+   extendr*   r,   r-   copyr0   
subprocessPopenr9   rg   PIPESTDOUTcommunicatedecode
cmd_outerrUnicodeDecodeError
returncodecmd_returncoder8   r   r
   )rK   rp   pcommrT   s        r   runzCompilerRunner.run   sv    ,,
 	
4*+++jooXE
 SXXdhhjj11#'!%#-?$.O$.$5!$& & & }}	;"1gnnW55DOO! 	; 	; 	;"1gnn\::DOOO	;l !##IPP$$dhD4G0H0H$/ C s### 333s    C< <*D)(D))NTNr   NNNNNNNNN)N)__name__
__module____qualname____doc____annotations__r   rU   classmethodr7   rg   r   r   r    r   r   r      s         $ $L ((((( "!!! &%%% <;;; 1000UXX\SWI> I> I> I>V 	B 	B 	B [	B  .4 4 4 4 4r    r   c                  j    e Zd ZdZdZ eg d          ZdZdj        dj        dj        dZ	ddd	dZ
d
S )CCompilerRunnerCCCFLAGS))gnugcc)intelicc)llvmclang)c89c90c99c11-std={})r   r   r   r   r   r   Nr   r   r   r   r   r   r   r   r8   r   r   r   r    r   r   r      s{         K ! ! !  M -I ! L $ $   r    r   c                .     ddi v r fd}nd }|S )Ng++)zWimplicit-interfacec                ,             D ]	}|| v r dS 
dS )NFTr   )r   nw
cmplr_namenot_welcomes     r   fltrz_mk_flag_filter.<locals>.fltr   s1    !*- ! !77 55 4r    c                    dS )NTr   r   s    r   r   z_mk_flag_filter.<locals>.fltr   s    4r    r   )r   r   r   s   ` @r   _mk_flag_filterr      sQ    23K[  	 	 	 	 	 	 		 	 	Kr    c                  j    e Zd ZdZdZ eg d          ZdZdj        dj        dj        dZ	ddd	dZ
d
S )CppCompilerRunnerCXXCXXFLAGS))r   r   )r   icpc)r   clang++)zc++98zc++0xr   )r   r   r   r   r   r   Nr   r   r    r   r   r      s{         "K ! ! !  M #I  # L $ $   r    r   c                  L    e Zd ZdZdZdZd d dZ eddg          Zd	d
dZ	dS )FortranCompilerRunnerFCFFLAGS)Nf77f95f2003f2008c                D    | dn| dk    rdnd                     |           S )Nz-std=gnur   z-std=legacyr   r8   r   s    r   r   zFortranCompilerRunner.<lambda>!  s+    AIjjAQVJJ==\e\l\lmn\o\o r    c                D    | dnd                     | dd                    S )Nz
-stand f08z
-stand f{}r   r   s    r   r   zFortranCompilerRunner.<lambda>"  s'    19<<,:M:MaPRPSPSf:U:U r    )gfortranifort)r   r   )r   r   r   r   N)
r   r   r   r   r   r   r   r   r   r   r   r    r   r   r     so         6I poUU L
  K!  M $ $   r    r   )
__future__r   typingr   r   collectionsr   r,   rG   rs   r5   utilr   r	   r
   r   r   r   r   r   r   r    r   <module>r      sb   " " " " " " % % % % % % % % # # # # # # 				 				              
D4 D4 D4 D4 D4 D4 D4 D4N    n   4         6    N     r    