o
    *ήcc#                     @   s   d dl mZmZmZ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 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 )    )CallableDictOptionalTupleUnion)OrderedDictN   )find_binary_of_commandunique_listCompileErrorc                   @   sN   e Zd ZdZdZdZdZdZ			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.

    NT.c                 K   s  t |tr	tdt|| _|| _|pg | _|| _|r"|\| _| _	n(|d u r-t
jdd }| |\| _| _	| _| j	d u rJtdd| j |pMg | _|pRg | _|pWg | _|p\g | _|	pag | _|
pi| jd | _|| _| jr}ttdd | j| _nd| jvr| jd | jr| j| j| j | j |pg | _|d urt d	}t d
}|du rt!t"|j#|rt$dt!t"|j#|rd S |d d S |du rt!t"|j#|rd S t!t"|j#|rt$d|d d S d}t||d S )Nz2Expected argument sources to be a list of strings.SYMPY_COMPILER_VENDORz No compiler found (searched: {})z, r   c                 S   s   | dkS )N-c xr   r   K/tmp/pip-target-vg8gfxp4/lib/python/sympy/utilities/_compilation/runners.py<lambda>\   s    z)CompilerRunner.__init__.<locals>.<lambda>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joincompiler_dictvaluesdefineundefinclude_dirs	librarieslibrary_dirs	standardsstd
run_linkerfilterappendstd_formaterlinklinerecompileanymapmatchr   )selfr   r   r   r/   compilerr   r*   r+   r,   r.   r(   r)   strict_aliasingpreferred_vendorr3   kwargsnsa_resa_remsgr   r   r   __init__A   sb   













zCompilerRunner.__init__c                    s^   t  j }|r||v 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&   .0r   clsr   r   
<listcomp>   s    z0CompilerRunner.find_compiler.<locals>.<listcomp>)r   r&   keysr   r$   r	   compiler_name_vendor_mapping)rE   r<   
candidatesnamepathr   rD   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r:|dd | jD dd | jD  | j	 7 }g }t
dd|D ]}t|d	u r`||vr`|| d
|}t|qE|S )zD List of arguments (str) to be passed to e.g. ``subprocess.Popen``. c                 S      g | ]}d | qS )z-Ur   rB   r   r   r   rF          z&CompilerRunner.cmd.<locals>.<listcomp>c                 S   rL   )z-Dr   rB   r   r   r   rF      rM   c                 S   rL   )z-Ir   rB   r   r   r   rF      rM   c                 S   rL   )z-Lr   rB   r   r   r   rF      rM   c                 S   rL   )z-lr   rB   r   r   r   rF      rM   z\$\{(\w+)\} Nz$Environment variable '{}' undefined.)r   r   r)   r(   r*   r   r/   r,   r+   r3   r4   findallr%   r   getenvr1   r$   r   )r9   cmdcountedenvvarr@   r   r   r   rQ      s6   

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yM   |d d| _Y nw |j| _| jdkrmd	d
|  | jt| j| j}t|| j| jfS )
Nz-oPWDrN   T)shellr   stdinstdoutstderrenvr   zutf-8z
iso-8859-1z3Error executing '{}' in {} (exited status {}):
 {}
)r
   r   extendr   r   r    copyr   
subprocessPopenr%   rQ   PIPESTDOUTcommunicatedecode
cmd_outerrUnicodeDecodeError
returncodecmd_returncoder$   r   r   )r9   rY   pcommr@   r   r   r   run   s2   


zCompilerRunner.run)NTNr   NNNNNNNNN)N)__name__
__module____qualname____doc__r&   r-   r2   rH   rA   classmethodr"   rQ   rh   r   r   r   r   r      s    '
<r   c                   @   :   e 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))gnugcc)intelicc)llvmclang)c89c90c99c11-std={})rq   rs   ru   rp   rr   rt   N	ri   rj   rk   r   r&   r-   r$   r2   rH   r   r   r   r   ro      s    
ro   c                    s.   ddi v r fdd}|S dd }|S )Ng++)zWimplicit-interfacec                    s      D ]	}|| v r dS qdS )NFTr   )r   nw
cmplr_name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   r~   r   _mk_flag_filter   s   r   c                   @   rn   )	CppCompilerRunner))rp   r|   )rr   icpc)rt   clang++)zc++98zc++0xrz   )r|   r   r   rp   rr   rt   Nr{   r   r   r   r   r      s    
r   c                   @   s8   e Zd ZdZdd dd dZeddgZdd	dZd
S )FortranCompilerRunner)Nf77f95f2003f2008c                 C   s"   | d u rdS | dkrdS d | S )Nz-std=gnur   z-std=legacyrz   r$   r   r   r   r   r     s   " zFortranCompilerRunner.<lambda>c                 C   s   | d u rdS d | dd  S )Nz
-stand f08z
-stand f{}r   r   r   r   r   r     s    )gfortranifort)rp   r   )rr   r   rp   rr   N)ri   rj   rk   r-   r2   r   r&   rH   r   r   r   r   r      s    
r   )typingr   r   tDictr   r   tTupler   tUnioncollectionsr   r   r4   r\   utilr	   r
   r   r   ro   r   r   r   r   r   r   r   <module>   s     5