o
    8ήch$                     @   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   :/tmp/pip-target-vg8gfxp4/lib/python/numba/pycc/platform.pyget_configs   s   r      c                 c   s    z,t  }ttj|d|  d}|V  W z|  t| W n   Y d S t| d S z|  t| W n   Y w t| w )Nztemp%swt)r   openospathjoincloseremovermdir)suffixtmpdirntfr   r   r   _gentmpfile   s"   r$   c               	   C   s   t  } t|  dD ]<}z/t|!}d}|| |  |  | j|jgt d W d    n1 s4w   Y  W q	 t	yE   Y  dS w dS )N)z.cz.cxxzint main(void) { return 0; })
output_dirFT)
r   r   r$   writeflushr   compilenamer	   	Exception)compilerr!   r#   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                   @   st   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   )DistributionFnpymath)_external_compiler_ok_raise_external_compiler_errordistutils.distr4   _verboser   	_compilerr   r   
_build_extfinalize_optionslibrary_dirs_py_lib_dirsinclude_dirs_py_include_dirsnp_miscget_info
_math_info)selfr4   r   r   r   __init__L   s   



zToolchain.__init__c                 C   s   | j S N)r9   rD   r   r   r   verbose[   s   zToolchain.verbosec                 C   s&   || _ t|rtj d S tj d S rF   )r9   r   set_thresholdINFOWARN)rD   valuer   r   r   rH   _   s    c                 C   s   d}d}t j}|dr)t jdkrddg}nddg}d	||d
| f }t||drAddg}d	||d
| f }t||drRd}d	||f }t|d| }t|)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)rD   basemsg	conda_msgplt	compilersmsgwinmsgr   r   r   r7   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)r:   r(   )rD   sourcesr%   r?   rZ   r[   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_symbolsr\   N)r   r   splitr:   linkr   SHARED_OBJECT)	rD   outputr_   r2   r=   ra   extra_ldflagsr%   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.
        rP   msvcrtr2   )r;   get_librariesr.   r   r   rC   )rD   libsr   r   r   get_python_libraries   s   

zToolchain.get_python_librariesc                 C      t | j| jd  S )zL
        Get the library directories necessary to link with Python.
        r=   )listr>   rC   rG   r   r   r   get_python_library_dirs   s   z!Toolchain.get_python_library_dirsc                 C   rm   )zo
        Get the include directories necessary to compile against the Python
        and Numpy C APIs.
        r?   )rn   r@   rC   rG   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.
        )r;   get_ext_filename)rD   ext_namer   r   r   rq      s   zToolchain.get_ext_filename)r   r   r   N)r/   r0   r1   rE   propertyrH   setterr7   r`   rh   rl   ro   rp   rq   r   r   r   r   r3   J   s$    



r3   c                  C   s"   dd l m  m}  | j}t| _d S )Nr   )numpy.distutils.exec_command	distutilsexec_command_exec_command)modorig_exec_commandr   r   r   _patch_exec_command   s   
r{   c           	      K   s(  |du r	t jdk}|du rt jdk}d}t jdkr7|r7t jdd}t| r/|dd| g} n|d| g} d}nt jdkrJt| rJdd	d
 | D } |pMd}ztj| ||tjtjdd}W n
 t	yg   Y dS w |
 \}}|jr{|rw|d7 }||7 }|dd dkr|dd }|rt| |j|fS )zg
    Internal workhorse for exec_command().
    Code from https://github.com/numpy/numpy/pull/7862
    NposixSHELLz/bin/shz-crN   Fntc                 s   s    | ]}t |V  qd S rF   )
_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)	command	use_shelluse_teer   
executableshproctexterrr   r   r   rx      sB   





rx   c                 C   s   d| vrd| v rd|  S | S )zB
    Quote the argument for safe use in a shell command line.
    "rN   z"%s"r   r   r   r   r   r      s   r   c                 C   s6   t | ttfr	dS zt|  W dS  ty   Y dS w )NFT)
isinstancestrbyteslenr*   r   r   r   r   r   
  s   r   )NN)%distutils.ccompilerr   r   distutils.command.build_extr   distutils.sysconfigr   rv   r   numpy.distutils.misc_util	misc_utilrA   	functoolsr   r   r   tempfiler   r   r	   
contextlibr
   r   r   partialfind_shared_endingfind_pyext_endingr$   r-   r6   objectr.   r3   r{   rx   r   r   r   r   r   r   <module>   s6    
{
3