U
    9%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                   @  sZ   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 | _|| _|rD|\| _| _	nP|d krZt
jdd }| |\| _| _	| _| j	d krtdd| j |pg | _|pg | _|pg | _|pg | _|	pg | _|
p| jd | _|| _| jrttdd | j| _nd| jkr| jd | jr4| j| j| j | j |p<g | _|d k	rt d	}t d
}|dkrt!t"|j#|rt$dnt!t"|j#|rn
|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.ZSYMPY_COMPILER_VENDORz No compiler found (searched: {})z, r   c                 S  s   | dkS )N-c xr   r   c/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sympy/utilities/_compilation/runners.py<lambda>]       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_vendorr0   kwargsZnsa_reZsa_remsgr   r   r   __init__B   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   .0r   clsr   r   
<listcomp>   s     z0CompilerRunner.find_compiler.<locals>.<listcomp>)r   r   keysr   r$   r   r   )r?   r8   
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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   r<   r   r   r   r@      s     z&CompilerRunner.cmd.<locals>.<listcomp>c                 S  s   g | ]}d | qS )z-Dr   r<   r   r   r   r@      s     c                 S  s   g | ]}d | qS )z-Ir   r<   r   r   r   r@      s     c                 S  s   g | ]}d | qS )z-Lr   r<   r   r   r   r@      s     c                 S  s   g | ]}d | qS )z-lr   r<   r   r   r   r@      s     z\$\{(\w+)\} Nz$Environment variable '{}' undefined.)r   r   r(   r'   r)   r   r-   r+   r*   r0   r1   findallr%   r    getenvr/   r$   r	   )r6   cmdZcountedZenvvarr:   r   r   r   rH      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PWDrE   T)shellr   stdinstdoutstderrenvr   zutf-8z
iso-8859-1z3Error executing '{}' in {} (exited status {}):
 {}
)r   r   extendr   r    r!   copyr   
subprocessPopenr%   rH   PIPESTDOUTcommunicatedecodeZ
cmd_outerrUnicodeDecodeError
returncodeZcmd_returncoder$   r   r	   )r6   rM   pZcommr:   r   r   r   run   s6    


   zCompilerRunner.run)NTNr   NNNNNNNNN)N)
__name__
__module____qualname____doc____annotations__r;   classmethodr#   rH   rY   r   r   r   r   r
      s(   
'                 
<r
   c                   @  s<   e 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)gnugcc)intelicc)llvmclang)Zc89Zc90Zc99Zc11-std={})rb   rd   rf   ra   rc   re   N	rZ   r[   r\   r   r   r   r$   r   r   r   r   r   r   r`      s   r`   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   rm      s    r   )rl   rm   r   rk   r   _mk_flag_filter   s
    rn   c                   @  s<   e 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)ra   ri   )rc   icpc)re   clang++)zc++98zc++0xrg   )ri   rp   rq   ra   rc   re   Nrh   r   r   r   r   ro      s   ro   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 krdS | dkrdS d | S )Nz-std=gnurs   z-std=legacyrg   r$   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{}rt   r   r   r   r   r     r   )gfortranifort)ra   rv   )rc   rw   ra   rc   N)rZ   r[   r\   r   r   r   r   r   r   r   r   r   rr      s   rr   )
__future__r   typingr   r   collectionsr   r    r1   rP   utilr   r   r	   r
   r`   rn   ro   rr   r   r   r   r   <module>   s    5