U
    9%e                     @   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   R/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/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   )maxsizec               
   C   s   t  } t|  dD ]n}zPt|>}d}|| |  |  | j|jgt|jj	d W 5 Q R X W q t
k
r~   Y  dS X q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_dirFT)new_compilercustomize_compilerr   writeflushr   compilenamer   anchor	Exception)compilerr   r   Z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                   @   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   s   t  s|   d| _t | _t| j tt | _| j	  | jj
| _| jj| _dt gi}tjdkrrg |d< n
dg|d< || _d S )NFinclude_dirswin32r0   m)r+   _raise_external_compiler_error_verboser"   	_compilerr#   r   r   
_build_extfinalize_optionslibrary_dirs_py_lib_dirsr2   _py_include_dirsnpZget_includer   r   
_math_info)selfZnp_compile_argsr   r   r   __init__R   s    






zToolchain.__init__c                 C   s   | j S N)r6   r?   r   r   r   verbosed   s    zToolchain.verbosec                 C   s    || _ t|rtjntj d S rA   )r6   logset_thresholdINFOWARN)r?   valuer   r   r   rC   h   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-64r3   zCannot find suitable msvc.zUnknown platform %s)r   r   
startswithr    r   RuntimeError)r?   ZbasemsgZ	conda_msgZpltZ	compilersmsgZwinmsgr   r   r   r5   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!   r2   dependsmacrosextra_preargs)r7   r&   )r?   sourcesr!   r2   rO   rP   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_symbolsrQ   N)r   r   splitr7   link	CCompilerZSHARED_OBJECT)	r?   outputrS   r0   r:   rU   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.
        r3   msvcrtr0   )r8   Zget_librariesr,   r   r   r>   )r?   Z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;   rB   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.
        r2   )r]   r<   r>   rB   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)r?   Zext_namer   r   r   r`      s    zToolchain.get_ext_filename)r   r   r   N)r   r   r   N)r-   r.   r/   r@   propertyrC   setterr5   rT   rZ   r\   r^   r_   r`   r   r   r   r   r1   P   s(   

      
     
r1   c                 C   s   d| krd| krd|  S | S )zB
    Quote the argument for safe use in a shell command line.
    "rJ   z"%s"r   r   r   r   r   
_quote_arg   s    rd   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   _is_sequence   s    ri   )%
setuptoolsZsetuptools.command.build_extr   Zsetuptools.distr   numpyr=   	functoolsr   
subprocessr   tempfiler   
contextlibr   pathlibr   	distutilsZ	ccompilerrX   r"   	sysconfigr#   rD   r   r   partialZfind_shared_endingZfind_pyext_endingr   	lru_cacher+   objectr,   r1   rd   ri   r   r   r   r   <module>   s8   





x