U
    ,dh$                     @   s  d dl mZmZ d dlmZ d dlmZ d dlmZ d dl	m  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 d dlmZ dd	d
Zdd Zeed ZeedZedd Zdd Ze ZG dd deZG dd deZ dd Z!dddZ"dd Z#dd Z$dS )    )	CCompilernew_compiler)	build_ext)customize_compiler)logN)NamedTemporaryFilemkdtemp
gettempdir)contextmanager)z.dllz.pyd).sor   )windefaultc                 C   s   t tjd d t d |  S )N   r   )_configsgetsysplatformarg r   7/tmp/pip-unpacked-wheel-eu7e0c37/numba/pycc/platform.pyget_configs   s    r      c                 c   s^   z(t }ttj|d|  d}|V  W 5 z|   t| W n   Y nX t| X d S )Nztemp%swt)closeosremovermdirr   openpathjoin)suffixntfZtmpdirr   r   r   _gentmpfile   s    
r#   c               
   C   s   t  } t|  dD ]h}zJt|8}d}|| |  |  | j|jgt d W 5 Q R X W q t	k
rx   Y  dS X qdS )N)z.cz.cxxzint main(void) { return 0; })
output_dirFT)
r   r   r#   writeflushr   compilenamer	   	Exception)compilerr!   r"   Zsimple_cr   r   r   _check_external_compiler.   s    

"r+   c                   @   s   e Zd Zg ZdS )_DummyExtensionN)__name__
__module____qualname__	librariesr   r   r   r   r,   F   s   r,   c                   @   sj   e Zd Zdd Zedd Zejdd Zdd Zdd
dZdddZ	dd Z
dd Zdd Zdd Zd	S )	Toolchainc                 C   sj   t s|   ddlm} d| _t | _t| j t| | _	| j	
  | j	j| _| j	j| _td| _d S )Nr   )DistributionFZnpymath)_external_compiler_ok_raise_external_compiler_errordistutils.distr2   _verboser   	_compilerr   r   
_build_extfinalize_optionslibrary_dirs_py_lib_dirsinclude_dirs_py_include_dirsnp_miscget_info
_math_info)selfr2   r   r   r   __init__L   s    



zToolchain.__init__c                 C   s   | j S N)r6   rA   r   r   r   verbose[   s    zToolchain.verbosec                 C   s    || _ t|rtjntj d S rC   )r6   r   set_thresholdINFOWARN)rA   valuer   r   r   rE   _   s    c                 C   s   d}d}t j}|drLt jdkr,ddg}nddg}d	||d
| f }nN|drvddg}d	||d
| f }n$|drd}d	||f }nd| }t|d S )NzYAttempted to compile AOT function without the compiler used by `numpy.distutils` present.z(If using conda try:

#> conda install %slinuxl        zgcc_linux-32zgxx_linux-32zgcc_linux-64zgxx_linux-64z%s %s darwinzclang_osx-64zclangxx_osx-64win32zCannot find suitable msvc.zUnknown platform %s)r   r   
startswithmaxsizer    RuntimeError)rA   ZbasemsgZ	conda_msgZpltZ	compilersmsgZwinmsgr   r   r   r4   f   s     




z(Toolchain._raise_external_compiler_errorr   Nc                 C   s    | j j|||||pg |d}|S )a  
        Compile the given source files into a separate object file each,
        all beneath the *output_dir*.  A list of paths to object files
        is returned.

        *macros* has the same format as in distutils: a list of 1- or 2-tuples.
        If a 1-tuple (name,), the given name is considered undefined by
        the C preprocessor.
        If a 2-tuple (name, value), the given name is expanded into the
        given value by the C preprocessor.
        )r$   r<   dependsmacrosextra_preargs)r7   r'   )rA   sourcesr$   r<   rR   rS   Zextra_cflagsobjectsr   r   r   compile_objects{   s    zToolchain.compile_objectsc           	   
   C   s2   t j|\}}| jjtj|||||||d dS )zu
        Create a shared library *output* linking the given *objects*
        and *libraries* (all strings).
        )export_symbolsrT   N)r   r   splitr7   linkr   ZSHARED_OBJECT)	rA   outputrV   r0   r:   rX   Zextra_ldflagsr$   Zoutput_filenamer   r   r   link_shared   s      zToolchain.link_sharedc                 C   s0   | j t }tjdkr"|dg }|| jd  S )zJ
        Get the library arguments necessary to link with Python.
        rM   msvcrtr0   )r8   Zget_librariesr,   r   r   r@   )rA   Zlibsr   r   r   get_python_libraries   s    

zToolchain.get_python_librariesc                 C   s   t | j| jd  S )zL
        Get the library directories necessary to link with Python.
        r:   )listr;   r@   rD   r   r   r   get_python_library_dirs   s    z!Toolchain.get_python_library_dirsc                 C   s   t | j| jd  S )zo
        Get the include directories necessary to compile against the Python
        and Numpy C APIs.
        r<   )r_   r=   r@   rD   r   r   r   get_python_include_dirs   s    z!Toolchain.get_python_include_dirsc                 C   s   | j |S )zR
        Given a C extension's module name, return its intended filename.
        )r8   get_ext_filename)rA   Zext_namer   r   r   rb      s    zToolchain.get_ext_filename)r   r   r   N)r   r   r   N)r-   r.   r/   rB   propertyrE   setterr4   rW   r\   r^   r`   ra   rb   r   r   r   r   r1   J   s(   

      
     
r1   c                  C   s"   dd l m  m}  | j}t| _d S )Nr   )Znumpy.distutils.exec_command	distutilsZexec_command_exec_command)modZorig_exec_commandr   r   r   _patch_exec_command   s    rh   c           	      K   s.  |dkrt jdk}|dkr$t jdk}d}t jdkrn|rnt jdd}t| r^|dd| g} n
|d| g} d}n&t jdkrt| rdd	d
 | D } |pd}ztj| ||tjtjdd}W n t	k
r   Y dS X |
 \}}|jr|r|d7 }||7 }|dd dkr|dd }|r$t| |j|fS )zg
    Internal workhorse for exec_command().
    Code from https://github.com/numpy/numpy/pull/7862
    NposixSHELLz/bin/shz-crK   Fntc                 s   s   | ]}t |V  qd S rC   )
_quote_arg).0r   r   r   r   	<genexpr>   s     z _exec_command.<locals>.<genexpr>T)shellenvstdoutstderruniversal_newlines)    
)r   r(   environr   _is_sequencer    
subprocessPopenPIPEOSErrorcommunicate
returncodeprint)	commandZ	use_shellZuse_teerp   
executableshproctexterrr   r   r   rf      s@    




rf   c                 C   s   d| krd| krd|  S | S )zB
    Quote the argument for safe use in a shell command line.
    "rK   z"%s"r   r   r   r   r   rl      s    rl   c                 C   s<   t | ttfrdS zt|  W dS  tk
r6   Y dS X d S )NFT)
isinstancestrbyteslenr)   r   r   r   r   ry   
  s    ry   )NN)%distutils.ccompilerr   r   Zdistutils.command.build_extr   distutils.sysconfigr   re   r   Znumpy.distutils.misc_utilZ	misc_utilr>   	functoolsr   rz   r   tempfiler   r   r	   
contextlibr
   r   r   partialZfind_shared_endingZfind_pyext_endingr#   r+   r3   objectr,   r1   rh   rf   rl   ry   r   r   r   r   <module>   s4   
{
3