
    MZd#                        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
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                  f    e Zd ZU dZ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.

    zdict[str, str]compiler_dictztuple[None | str, ...]	standardsz)dict[str, Callable[[Optional[str]], str]]std_formatercompiler_name_vendor_mappingNc                   t        |t              rt        d      t        |      | _        || _        |xs g | _        || _        |r|\  | _        | _	        n| t        j                  j                  dd       }| j                  |      \  | _        | _	        | _        | j                  At        dj                  dj!                  | j"                  j%                                           |xs g | _        |xs g | _        |xs g | _        |xs g | _        |	xs g | _        |
xs | j0                  d   | _        || _        | j4                  r&t        t7        d | j                              | _        n)d| j                  vr| j                  j9                  d       | j2                  rB| j                  j9                   | j:                  | j                     | j2                               |xs g | _        |t?        j@                  d      }t?        j@                  d	      }|d
u r\tC        tE        |jF                  |            rtI        d      tC        tE        |jF                  |            ry |j9                  d       y |du r\tC        tE        |jF                  |            ry tC        tE        |jF                  |            rtI        d      |j9                  d       y d}t        |j                  |            y )Nz2Expected argument sources to be a list of strings.SYMPY_COMPILER_VENDORz No compiler found (searched: {})z, r   c                    | dk7  S )N-c xs    F/usr/lib/python3/dist-packages/sympy/utilities/_compilation/runners.py<lambda>z)CompilerRunner.__init__.<locals>.<lambda>]   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 {})%
isinstancestr
ValueErrorlistsourcesoutflagscwdcompiler_namecompiler_binaryosenvirongetfind_compilercompiler_vendorformatjoinr   valuesdefineundefinclude_dirs	librarieslibrary_dirsr   std
run_linkerfilterappendr   linklinerecompileanymapmatchr
   )selfr   r    r!   r3   compilerr"   r/   r0   r1   r2   r-   r.   strict_aliasingpreferred_vendorr6   kwargsnsa_resa_remsgs                       r   __init__zCompilerRunner.__init__B   s    gs#QRRG}[b
7?4D 4  '#%::>>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. / !B&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!<==) 'r   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   r*   r   r   )clsr?   
candidatesr   namepaths         r   r(   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!   r.   r-   r/   r   r3   r1   r0   r6   r7   findallr+   r%   getenvr5   r*   r
   )r<   r   cmdcountedenvvarrC   s         r   rO   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PWDrL   T)shellr"   stdinstdoutstderrenvr   zutf-8z
iso-8859-1z3Error executing '{}' in {} (exited status {}):
 {}
)r	   r!   extendr    r%   r&   copyr"   
subprocessPopenr+   rO   PIPESTDOUTcommunicatedecode
cmd_outerrUnicodeDecodeError
returncodecmd_returncoder*   r   r
   )r<   rX   pcommrC   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__rD   classmethodr(   rO   rg   r   r   r   r   r      sW    $N "! &% <; #10UXX\SW:>x 	B 	B.4r   r   c                  x    e Zd Z eg d      ZdZdj                  dj                  dj                  dZddddZy)	CCompilerRunner))gnugcc)intelicc)llvmclang)c89c90c99c11-std={})rr   rt   rv   rq   rs   ru   N	ri   rj   rk   r   r   r   r*   r   r   r   r   r   rp   rp      sO     ! M -I !!L $ r   rp   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                  x    e Zd Z eg d      ZdZdj                  dj                  dj                  dZddddZy)	CppCompilerRunner))rq   r~   )rs   icpc)ru   clang++)zc++98zc++0xr{   )r~   r   r   rq   rs   ru   Nr|   r   r   r   r   r      sO     ! M #I   ##L $ r   r   c                  <    e Zd ZdZd d dZ eddg      ZdddZy	)
FortranCompilerRunner)Nf77f95f2003f2008c                :    | dS | dk(  rdS dj                  |       S )Nz-std=gnur   z-std=legacyr{   r*   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)rq   r   )rs   r   rq   rs   N)ri   rj   rk   r   r   r   r   r   r   r   r   r   r      s>    6I pUL
  ! M $ r   r   )
__future__r   typingr   r   collectionsr   r%   r7   r[   utilr   r	   r
   r   rp   r   r   r   r   r   r   <module>r      sW    " % # 	 	  
q4 q4hn . 0N r   