U
    ZÊ¹jý'  ã                   @  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|\| _| _nÎtj 	| j¡rètj| j | _| j ¡ D ]"\}}|| jkr’|| _|| _ qæq’t| j ¡ ƒd \| _| _t d| j| jf ¡ nR|d krþtj 	dd ¡}|  |¡\| _| _| _| jd k�r:td d | j ¡ ¡¡ƒ‚|�pBg | _|�pNg | _|�pZg | _|�pfg | _|	�prg | _|
�p„| jd | _|| _ | j �r®tt!dd„ | jƒƒ| _nd	| jk�rÆ| j "d	¡ | j�rè| j "| j#| j | jƒ¡ |�pðg d
d„ t$tj%tj 	| j&d¡ ¡ ƒD ƒ | _'|d k	�rÖt( )d¡}t( )d¡}|dk�r~t*t$|j+|ƒƒ�r^t,dƒ‚nt*t$|j+|ƒƒ�rrn
| "d¡ nX|dk�rÄt*t$|j+|ƒƒ�rœn&t*t$|j+|ƒƒ�r¸t,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   úc/var/www/html/bwave/python/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rÜd	 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