o
    e#                     @  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
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                   @  s`   e Zd ZU dZ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.

    z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 | _|| _|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.ZSYMPY_COMPILER_VENDORz No compiler found (searched: {})z, r   c                 S  s   | dkS )N-c xr   r   TD:\Projects\ConvertPro\env\Lib\site-packages\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cwdZcompiler_namecompiler_binaryosenvirongetfind_compilerZ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   r,   compilerr   r(   r)   r*   r+   r&   r'   Zstrict_aliasingpreferred_vendorr/   kwargsZnsa_reZsa_remsgr   r   r   __init__B   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   r   )r>   r7   
candidatesnamepathr   r=   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   r;   r   r   r   r?          z&CompilerRunner.cmd.<locals>.<listcomp>c                 S  rD   )z-Dr   r;   r   r   r   r?      rE   c                 S  rD   )z-Ir   r;   r   r   r   r?      rE   c                 S  rD   )z-Lr   r;   r   r   r   r?      rE   c                 S  rD   )z-lr   r;   r   r   r   r?      rE   z\$\{(\w+)\} Nz$Environment variable '{}' undefined.)r   r   r'   r&   r(   r   r,   r*   r)   r/   r0   findallr$   r   getenvr.   r#   r	   )r5   cmdZcountedZenvvarr9   r   r   r   rI      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-oZPWDrF   T)shellr   stdinstdoutstderrenvr   zutf-8z
iso-8859-1z3Error executing '{}' in {} (exited status {}):
 {}
)r   r   extendr   r   r    copyr   
subprocessPopenr$   rI   PIPESTDOUTcommunicatedecodeZ
cmd_outerrUnicodeDecodeError
returncodeZcmd_returncoder#   r   r	   )r5   rN   pZcommr9   r   r   r   run   s2   


zCompilerRunner.run)NTNr   NNNNNNNNN)N)
__name__
__module____qualname____doc____annotations__r:   classmethodr"   rI   rZ   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)Zc89Zc90Zc99Zc11-std={})rd   rf   rh   rc   re   rg   N	r[   r\   r]   r   r   r   r#   r   r   r   r   r   r   rb      s    
rb   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_nameZnot_welcomer   r   fltr   s
   z_mk_flag_filter.<locals>.fltrc                 S  s   dS )NTr   r   r   r   r   ro      s   r   )rn   ro   r   rm   r   _mk_flag_filter   s   rp   c                   @  ra   )	CppCompilerRunner))rc   rk   )re   icpc)rg   clang++)zc++98zc++0xri   )rk   rr   rs   rc   re   rg   Nrj   r   r   r   r   rq      s    
rq   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f77Zf95Zf2003Zf2008c                 C  s"   | d u rdS | dkrdS d | S )Nz-std=gnuru   z-std=legacyri   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{}rv   r   r   r   r   r     s    )gfortranifort)rc   rx   )re   ry   rc   re   N)r[   r\   r]   r   r   r   r   r   r   r   r   r   rt      s    
rt   )
__future__r   typingr   r   collectionsr   r   r0   rQ   utilr   r   r	   r
   rb   rp   rq   rt   r   r   r   r   <module>   s     5