
    sg'                        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y)    )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
y)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_mappingNc                z	   t        |t              rt        d      t        |      | _        || _        |xs g | _        t        j                  j                  | j                        r>| xj                  t        j                  | j                     j                         z  c_        || _        |r|\  | _        | _        nt        j                  j                  | j                        rt        j                  | j                     | _        | j                   j#                         D ]#  \  }}|| j                  v s|| _        || _         n t        | j                   j#                               d   \  | _        | _        t'        j(                  d| j                  d| j                         n| t        j                  j                  dd       }| j+                  |      \  | _        | _        | _        | j                  At        dj-                  dj/                  | j                   j1                                           |xs g | _        |xs g | _        |xs g | _        |xs g | _        |	xs g | _        |
xs | j<                  d   | _        || _         | j@                  r&t        tC        d | j                              | _        n)d	| j                  vr| j                  jE                  d	       | j>                  rB| j                  jE                   | jF                  | j                     | j>                               |xs g tI        t        jJ                  t        j                  j                  | jL                  d
      j                               D cg c]	  }|d
k7  r| c}z   | _'        |tQ        jR                  d      }tQ        jR                  d      }|du r\tU        tI        |jV                  |            rtY        d      tU        tI        |jV                  |            ry |jE                  d       y |du r\tU        tI        |jV                  |            ry tU        tI        |jV                  |            rtY        d      |jE                  d       y d}t        |j-                  |            y c c}w )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k7  S )N-c xs    W/var/www/html/venv/lib/python3.12/site-packages/sympy/utilities/_compilation/runners.py<lambda>z)CompilerRunner.__init__.<locals>.<lambda>o   s
    qDy     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&   r<   compilerr+   r8   r9   r:   r;   r6   r7   strict_aliasingpreferred_vendorrA   kwargskvlfnsa_resa_remsgs                          r   __init__zCompilerRunner.__init__G   s    gs#QRRG}[b
::>>$001JJ"**T%;%;<BBDDJ7?4D 4ZZ^^D556#%::d.G.G#HD **002 J1,,,+,D()*D&	J <@@R@R@X@X@Z;[\];^8$d&8#33T5G5GI J  '#%::>>2I4#P MQM_M_`pMqJD 4d6J##+ !C!J!J499UYUgUgUnUnUpKq!rssl[b
(.B"b(.B+$..+$??f%8$**EFDJ4::%

!!$'88JJ $d//""$$(HH. / "RIIrzz~~d&>&>CIIK:
 ,22X -/ ,  &ZZ 56FJJ12E$&s6<</0&']^^U[[%01LL!45 E)s6<</03u{{E23*+abb%;<R O!<==) '	,s   R8c                   t        | j                  j                               }|r%||v r|g|z   }nt        dj	                  |            t        |D cg c]  }| j                  |    c}      \  }}||| j                  |   fS c c}w )z/ Identify a suitable C/fortran/other compiler. zUnknown vendor {})r#   r   keysr"   r3   r   r   )clsrI   
candidatesr   namepaths         r   r2   zCompilerRunner.find_compiler   s     #++0023
:-./
:
 !4!;!;<L!MNN+:,VaS->->q-A,VW
dT3;;DAAA -Ws   Bc                   | j                   g| j                  z   | j                  D cg c]  }d|z   	 c}z   | j                  D cg c]  }d|z   	 c}z   | j                  D cg c]  }d|z   	 c}z   | j
                  z   }| j                  rK|| j                  D cg c]  }d|z   	 c}| j                  D cg c]  }d|z   	 c}z   | j                  z   z  }g }t        j                  ddj                  |            D ]I  }t        j                  |      ||vs|j                  |       dj!                  |      }t#        |       |S c c}w c c}w c c}w c c}w c c}w )	zD List of arguments (str) to be passed to e.g. ``subprocess.Popen``. z-Uz-Dz-Iz-Lz-lz\$\{(\w+)\} z$Environment variable '{}' undefined.)r-   r&   r7   r6   r8   r$   r<   r:   r9   rA   rB   findallr4   r'   getenvr>   r3   r
   )rF   r   cmdcountedenvvarrP   s         r   r\   zCompilerRunner.cmd   sX    !!"JJ!ZZ(T!V() "[[)T!V)* "../T!V/	0
 LL 	 ??T%6%67T!V7%)^^4T!V45MM" #C jj#? 	,Fyy ((NN6*@GGOC&s++	, 
! ))/ 84s   EE$EE9E"c           	        t        | j                        | _        | j                  j                  d| j                  g       t        j
                  j                         }| j                  |d<   t        j                  dj                  | j                               d| j                  t        j                  t        j                  t        j                  |      }|j                         }	 |d   j                  d      | _        |j$                  | _        | j&                  dk7  rcd	j)                  dj                  | j                               | j                  t+        | j&                        | j                         }t-        |      | j                   | j&                  fS # t"        $ r |d   j                  d      | _        Y w xY w)
Nz-oPWDrY   T)shellr+   stdinstdoutstderrenvr   zutf-8z
iso-8859-1z3Error executing '{}' in {} (exited status {}):
 {}
)r	   r&   extendr%   r'   r(   copyr+   
subprocessPopenr4   r\   PIPESTDOUTcommunicatedecode
cmd_outerrUnicodeDecodeError
returncodecmd_returncoder3   r   r
   )rF   re   pcommrP   s        r   runzCompilerRunner.run   sY    ,
 	

4*+jjooXXE
 SXXdhhj1#'!%#-??$.OO$.$5$5!$& }}	;"1gnnW5DO  ll !#IPP$dhhD4G4G0H$//C s## 3 333 " 	;"1gnn\:DO	;s   -F! !"GG)NTN.NNNNNNNNN)N)__name__
__module____qualname____doc____annotations__r   rQ   classmethodr2   r\   rt   r   r   r   r   r      sq    $L (( "! &% <; #10UXX\SWI>V 	B 	B.4r   r   c                      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
y
)CCompilerRunnerCCCFLAGS))gnugcc)intelicc)llvmclang)c89c90c99c11-std={})r   r   r   r   r   r   Nrv   rw   rx   r   r   r   r   r   r3   r   r   r   r   r   r}   r}      s[      ! M -I !!L $ r   r}   c                0     ddi v r fd}|S d }|S )Ng++)zWimplicit-interfacec                &       D ]  }|| v s y y)NFTr   )r   nw
cmplr_namenot_welcomes     r   fltrz_mk_flag_filter.<locals>.fltr   s&    !*- !7 ! r   c                     y)NTr   r   s    r   r   z_mk_flag_filter.<locals>.fltr   s    r   r   )r   r   r   s   ` @r   _mk_flag_filterr      s,    23K[ 	 K	Kr   c                      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
y
)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[     " ! M #I   ##L $ r   r   c                  D    e Zd ZdZdZdZd d dZ eddg      Zd	d
dZ	y)FortranCompilerRunnerFCFFLAGS)Nf77f95f2003f2008c                :    | dS | dk(  rdS dj                  |       S )Nz-std=gnur   z-std=legacyr   r3   r   s    r   r   zFortranCompilerRunner.<lambda>!  s&    AIj AQVJ= \e\l\lmn\o r   c                2    | dS dj                  | dd        S )Nz
-stand f08z
-stand f{}r   r   s    r   r   zFortranCompilerRunner.<lambda>"  s!    19< ,:M:MaPRPSf:U r   )gfortranifort)r   r   )r   r   r   r   N)
rv   rw   rx   r   r   r   r   r   r   r   r   r   r   r   r     sJ     6I pUL
  ! M $ r   r   )
__future__r   typingr   r   collectionsr   r'   rB   rh   r0   utilr   r	   r
   r   r}   r   r   r   r   r   r   <module>r      sZ    " % # 	 	   
D4 D4Nn 4 6N r   