o
    Td                     @   s  d dl Z d dl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
Z
d dlmZ d dlmZ d dlmZ e jjjZe jjjZe jjjZe jjZddd	Zd
d Zeed ZeedZedd Zejdddd ZG dd de Z!G dd de Z"dd Z#dd Z$dS )    N)	build_ext)Distribution)mkdtemp)contextmanager)Path)z.dllz.pyd).sor   )windefaultc                 C   s   t tjd d t d |  S )N   r	   )_configsgetsysplatformarg r   f/home/ncw/WWW/www-new/content/articles/pi-bbp/venv/lib/python3.10/site-packages/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    )maxsizec               	   C   s   t  } t|  dD ]?}z2t|$}d}|| |  |  | j|jgt|jj	d W d   n1 s7w   Y  W q	 t
yH   Y  dS w dS )zv
    Returns True if the "external compiler" bound in numpy.distutil is present
    and working, False otherwise.
    )z.cz.cxxzint main(void) { return 0; })
output_dirNFT)new_compilercustomize_compilerr    writeflushr   compilenamer   anchor	Exception)compilerr   r   simple_cr   r   r   external_compiler_works5   s    

r-   c                   @   s   e Zd Zg ZdS )_DummyExtensionN)__name__
__module____qualname__	librariesr   r   r   r   r.   L   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   s   t  s|   d| _t | _t| j tt | _| j	  | jj
| _| jj| _dt gi}tjdkr9g |d< ndg|d< || _d S )NFinclude_dirswin32r2   m)r-   _raise_external_compiler_error_verboser#   	_compilerr$   r   r   
_build_extfinalize_optionslibrary_dirs_py_lib_dirsr4   _py_include_dirsnpget_includer   r   
_math_info)selfnp_compile_argsr   r   r   __init__R   s   







zToolchain.__init__c                 C   s   | j S N)r8   rB   r   r   r   verbosed   s   zToolchain.verbosec                 C   s&   || _ t|rtj d S tj d S rE   )r8   logset_thresholdINFOWARN)rB   valuer   r   r   rG   h   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-64r5   zCannot find suitable msvc.zUnknown platform %s)r   r   
startswithr!   r   RuntimeError)rB   basemsg	conda_msgplt	compilersmsgwinmsgr   r   r   r7   o   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"   r4   dependsmacrosextra_preargs)r9   r'   )rB   sourcesr"   r4   rX   rY   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_symbolsrZ   N)r   r   splitr9   link	CCompilerSHARED_OBJECT)	rB   outputr]   r2   r<   r_   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.
        r5   msvcrtr2   )r:   get_librariesr.   r   r   rA   )rB   libsr   r   r   get_python_libraries   s   

zToolchain.get_python_librariesc                 C   s
   t | jS )zL
        Get the library directories necessary to link with Python.
        )listr=   rF   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.
        r4   )rl   r>   rA   rF   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)rB   ext_namer   r   r   ro      s   zToolchain.get_ext_filename)r   r   r   N)r/   r0   r1   rD   propertyrG   setterr7   r^   rg   rk   rm   rn   ro   r   r   r   r   r3   P   s$    



r3   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   
_quote_arg   s   rt   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   _is_sequence   s   ry   )%
setuptoolssetuptools.command.build_extr   setuptools.distr   numpyr?   	functoolsr   
subprocessr   tempfiler   
contextlibr   pathlibr   	distutils	ccompilerrb   r#   	sysconfigr$   rH   r   r   partialfind_shared_endingfind_pyext_endingr    	lru_cacher-   objectr.   r3   rt   ry   r   r   r   r   <module>   s:    





x