U
    L?h'                     @  s   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 dZG d	d
 d
eZdd ZG dd deZG dd deZdS )    )annotations)CallableOptional)OrderedDictN   )find_binary_of_commandunique_listCompileErrorc                   @  sv   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dZedddZdd Z	d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                 K  s  t |trtdt|| _|| _|p(g | _tj	| j
rT|  jtj| j
  7  _|| _|rl|\| _| _ntj	| jrtj| j | _| j D ]"\}}|| jkr|| _|| _ qqt| j d \| _| _td| j| jf  nR|d krtj	dd }| |\| _| _| _| jd kr:tdd| j |pBg | _|pNg | _|pZg | _|pfg | _|	prg | _|
p| jd | _|| _ | j rtt!dd | j| _nd	| jkr| j"d	 | jr| j"| j#| j | j |pg d
d t$tj%tj	| j&d D  | _'|d k	rt()d}t()d}|dkr~t*t$|j+|r^t,dnt*t$|j+|rrn
|"d nX|dkrt*t$|j+|rn&t*t$|j+|rt,dn
|"d nd}t||d S )Nz2Expected argument sources to be a list of strings.r   z<failed to determine what kind of compiler %s is, assuming %sZSYMPY_COMPILER_VENDORz No compiler found (searched: {})z, c                 S  s   | dkS )N-c xr   r   V/var/www/html/venv/lib/python3.8/site-packages/sympy/utilities/_compilation/runners.py<lambda>o       z)CompilerRunner.__init__.<locals>.<lambda>r   c                 S  s   g | ]}|d kr|qS ) r   ).0lfr   r   r   
<listcomp>x   s    z+CompilerRunner.__init__.<locals>.<listcomp>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cwdZcompiler_namecompiler_binaryr   r   itemsZ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%   r9   compilerr*   r5   r6   r7   r8   r3   r4   Zstrict_aliasingpreferred_vendorr>   kwargskvZnsa_reZsa_remsgr   r   r   __init__G   s    





 






zCompilerRunner.__init__c                   s^   t  j }|r4||kr&|g| }ntd|t fdd|D \}}|| j| fS )z/ Identify a suitable C/fortran/other compiler. zUnknown vendor {}c                   s   g | ]} j | qS r   )r   r   r   clsr   r   r      s     z0CompilerRunner.find_compiler.<locals>.<listcomp>)r"   r   keysr!   r0   r   r   )rM   rE   
candidatesnamepathr   rL   r   r/      s    zCompilerRunner.find_compilerc                 C  s   | j g| j dd | jD  dd | jD  dd | jD  | j }| jrt|dd | jD dd | jD  | j	 7 }g }t
dd|D ]6}t|d	kr||kr|| d
|}t|q|S )zD List of arguments (str) to be passed to e.g. ``subprocess.Popen``. c                 S  s   g | ]}d | qS )z-Ur   rK   r   r   r   r      s     z&CompilerRunner.cmd.<locals>.<listcomp>c                 S  s   g | ]}d | qS )z-Dr   rK   r   r   r   r      s     c                 S  s   g | ]}d | qS )z-Ir   rK   r   r   r   r      s     c                 S  s   g | ]}d | qS )z-Lr   rK   r   r   r   r      s     c                 S  s   g | ]}d | qS )z-lr   rK   r   r   r   r      s     z\$\{(\w+)\} Nz$Environment variable '{}' undefined.)r+   r%   r4   r3   r5   r#   r9   r7   r6   r>   r?   findallr1   r&   getenvr;   r0   r	   )rC   cmdZcountedZenvvarrI   r   r   r   rU      s4    


zCompilerRunner.cmdc              	   C  s   t | j| _| jd| jg tj }| j|d< tj	d
|  d| jtjtjtj|d}| }z|d d| _W n$ tk
r   |d d| _Y nX |j| _| jdkrd	d
|  | jt| j| j}t|| j| jfS )
Nz-oZPWDrR   T)shellr*   stdinstdoutstderrenvr   zutf-8z
iso-8859-1z3Error executing '{}' in {} (exited status {}):
 {}
)r   r%   extendr$   r&   r'   copyr*   
subprocessPopenr1   rU   PIPESTDOUTcommunicatedecodeZ
cmd_outerrUnicodeDecodeError
returncodeZcmd_returncoder0   r   r	   )rC   rZ   pZcommrI   r   r   r   run   s6    


   zCompilerRunner.run)NTNr   NNNNNNNNN)N)__name__
__module____qualname____doc____annotations__r   rJ   classmethodr/   rU   rf   r   r   r   r   r
      s.   
&                 
Kr
   c                   @  sD   e Zd ZdZdZedddg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)Zc89Zc90Zc99Zc11-std={})rq   rs   ru   rp   rr   rt   Nrg   rh   ri   r   r   r   r   r   r0   r   r   r   r   r   r   rm      s    rm   c                   s,   ddi kr  fdd}ndd }|S )Ng++)zWimplicit-interfacec                   s      D ]}|| kr dS qdS )NFTr   )r   nw
cmplr_nameZnot_welcomer   r   fltr   s    z_mk_flag_filter.<locals>.fltrc                 S  s   dS )NTr   r   r   r   r   r|      s    r   )r{   r|   r   rz   r   _mk_flag_filter   s
    r}   c                   @  sD   e Zd ZdZdZedddgZdZdjdjdjdZ	d	d
ddZ
dS )CppCompilerRunnerCXXZCXXFLAGS)rp   rx   )rr   icpc)rt   clang++)zc++98zc++0xrv   )rx   r   r   rp   rr   rt   Nrw   r   r   r   r   r~      s    r~   c                   @  s@   e Zd ZdZdZdZdd dd dZedd	gZd
ddZ	dS )FortranCompilerRunnerZFCZFFLAGS)Nf77Zf95Zf2003Zf2008c                 C  s"   | d krdS | dkrdS d | S )Nz-std=gnur   z-std=legacyrv   r0   r   r   r   r   r   !  r   zFortranCompilerRunner.<lambda>c                 C  s   | d krdS d | dd  S )Nz
-stand f08z
-stand f{}r   r   r   r   r   r   "  r   )gfortranifort)rp   r   )rr   r   rp   rr   N)
rg   rh   ri   r   r   r   r   r   r   r   r   r   r   r   r     s   r   )
__future__r   typingr   r   collectionsr   r&   r?   r]   r-   utilr   r   r	   r
   rm   r}   r~   r   r   r   r   r   <module>   s    H