U
    9%e)                     @   s   d dl m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mZmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ ejZejZe ZG d
d deZG dd deZdS )    )	distutils)	build_ext)	ExtensionN)typingsigutils)global_compiler_lock)ModuleCompilerExportEntry)	Toolchain)cextc                   @   s  e Zd ZdZdge Zi Zi Zd+ddZe	dd Z
e	dd	 Zejd
d	 Ze	dd Zejdd Ze	dd Zejdd Ze	dd Zejdd Ze	dd Zejdd Zdd Ze	dd Zdd Zdd Zdd  Zd!d" Zd#d$ Zed%d& Zed'd( Zd)d* ZdS ),CCz_
    An ahead-of-time compiler to create extension modules that don't
    depend on Numba.
    zmodulemixin.cNc                 C   s   d|krt d|| _d| | _i | _td}|d krH|j}|d }n$t|dr`|j}|j	}ntj
| j}|dd| _|| _t | _d| _tj| j| _| j|| _d	| _d| _d S )
N.z;basename should be a simple module name, not qualified nameZ
pycc_init_   __name____file__ FT)
ValueError	_basename_init_function_exported_functionssys	_getframe	f_globalshasattr__dict__r   modulesget_source_path_source_moduler
   
_toolchain_verboseospathdirname_output_dirZget_ext_filename_output_file_use_nrt_target_cpu)selfZextension_nameZsource_modulefdct r+   L/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/pycc/cc.py__init__/   s*    



zCC.__init__c                 C   s   | j S )z=
        The name of the extension module to create.
        )r   r(   r+   r+   r,   nameL   s    zCC.namec                 C   s   | j S )zJ
        The specific output file (a DLL) that will be generated.
        r%   r.   r+   r+   r,   output_fileS   s    zCC.output_filec                 C   s
   || _ d S Nr0   r(   valuer+   r+   r,   r1   Z   s    c                 C   s   | j S )z?
        The directory the output file will be put in.
        r$   r.   r+   r+   r,   
output_dir^   s    zCC.output_dirc                 C   s
   || _ d S r2   r5   r3   r+   r+   r,   r6   e   s    c                 C   s   | j S r2   r&   r.   r+   r+   r,   use_nrti   s    z
CC.use_nrtc                 C   s
   || _ d S r2   r7   r3   r+   r+   r,   r8   m   s    c                 C   s   | j S )z;
        The target CPU model for code generation.
        r'   r.   r+   r+   r,   
target_cpuq   s    zCC.target_cpuc                 C   s
   || _ d S r2   r9   r3   r+   r+   r,   r:   x   s    c                 C   s   | j S )zI
        Whether to display detailed information when compiling.
        r    r.   r+   r+   r,   verbose|   s    z
CC.verbosec                 C   s
   || _ d S r2   r;   r3   r+   r+   r,   r<      s    c                    sH   t \}}tj|f|  jkr4td   fdd}|S )zH
        Mark a function for exporting in the extension module.
        zduplicated export symbol %sc                    s   t  | }|j < | S r2   )r	   r   )funcentryexported_namer(   sigr+   r,   	decorator   s    
zCC.export.<locals>.decorator)r   Znormalize_signaturer   	signaturer   KeyError)r(   r@   rA   Zfn_argsZfn_rettyrB   r+   r?   r,   export   s    
z	CC.exportc                 C   s   t | j dd dS )Nc                 S   s   | j S r2   )symbol)r>   r+   r+   r,   <lambda>       z$CC._export_entries.<locals>.<lambda>)key)sortedr   valuesr.   r+   r+   r,   _export_entries   s    
zCC._export_entriesc                    s<   t jt | jd d  }| jr*|d  fdd|D S )Nz../core/runtime/nrt.cppc                    s   g | ]}t j |qS r+   )r!   r"   join).0r)   herer+   r,   
<listcomp>   s     z)CC._get_mixin_sources.<locals>.<listcomp>)r!   r"   r#   r   _mixin_sourcesr&   append)r(   Zmixin_sourcesr+   rO   r,   _get_mixin_sources   s
    
zCC._get_mixin_sourcesc                 C   s   d| j fdt| jfgS )NZPYCC_MODULE_NAMEZPYCC_USE_NRT)r   intr&   r.   r+   r+   r,   _get_mixin_defines   s    zCC._get_mixin_definesc                 C   s(   | j tjg }|s$| j tjg }|S r2   )_extra_cflagsr   r   platformr!   r/   )r(   extra_cflagsr+   r+   r,   _get_extra_cflags   s    zCC._get_extra_cflagsc                 C   sF   | j tjg }|s$| j tjg }tjdrBd|krB|d |S )Nlinuxz-pthread)_extra_ldflagsr   r   rX   r!   r/   
startswithrS   )r(   extra_ldflagsr+   r+   r,   _get_extra_ldflags   s    
zCC._get_extra_ldflagsc                 C   s<   |   }|  }| j }|  }| jj|||||d}|S )N)include_dirsmacrosrY   )rT   rV   r   get_python_include_dirsrZ   Zcompile_objects)r(   	build_dirsourcesra   r`   rY   objectsr+   r+   r,   _compile_mixins   s    

zCC._compile_mixinsc                 C   sj   t | j| j| j| jd}| j|_tj	|tj
| jd d }td| j| |j|dd |g|jfS )N)Zcpu_namer   z.oz%generating LLVM code for '%s' into %sT)wrap)r   rL   r   r&   r'   r   Zexternal_init_functionr!   r"   rM   splitextr%   loginfoZwrite_native_objectdll_exports)r(   rc   compilerZtemp_objr+   r+   r,   _compile_object_files   s    
  zCC._compile_object_filesc                 C   s   | j | j_ tjd| j d}| |\}}|| |7 }|  }tj	
| j| j}| j }| j }| jj||||||d t| dS )z/
        Compile the extension module.
        zpycc-build-%s-)prefix)export_symbolsr^   N)r<   r   tempfilemkdtempr   rm   rf   r_   r!   r"   rM   r$   r%   get_python_librariesget_python_library_dirsZlink_sharedshutilrmtree)r(   rc   re   rk   r^   Z
output_dll	librarieslibrary_dirsr+   r+   r,   compile   s    



 z
CC.compilec                 K   s   | dg |   }| dg | jg }| dg |   }| dg |   }| dg | j  }| dg | j  }| dg | j  }| j	d| j	
d	d
  }	tf |	| j |  |||||||d	|}
|
  | |
_|
S )z`
        Create a distutils extension object that can be used in your
        setup.py.
        ra   dependsextra_compile_argsextra_link_argsr`   rv   rw   Nr   r   )	r/   rd   ry   define_macrosr`   rv   rw   rz   r{   )poprV   r   rZ   r_   r   rb   rr   rs   r   rfind_CCExtensionr   rT   monkey_patch_distutils_cc)r(   kwargsra   ry   rz   r{   r`   rv   rw   Zpython_package_pathextr+   r+   r,   distutils_extension   sB    




	
zCC.distutils_extension)N)r   
__module____qualname____doc__extension_libsrR   rW   r\   r-   propertyr/   r1   setterr6   r8   r:   r<   rE   rL   rT   rV   rZ   r_   rf   r   rm   rx   r   r+   r+   r+   r,   r      sP   
















r   c                   @   s,   e Zd ZdZdZdZdd Zedd ZdS )r   zj
    A Numba-specific Extension subclass to LLVM-compile pure Python code
    to an extension module.
    NFc                 C   sJ   | j }ttjj|jf| jdd d   |	|j\}}|| _
d S )Nr   )r   dir_utilmkpathr!   r"   rM   
build_tempr/   splitrm   extra_objects)r(   r   ccre   _r+   r+   r,   _prepare_object_files  s    *z"_CCExtension._prepare_object_filesc                    s4   | j r
dS tj G  fddd }|t_d| _ dS )z}
        Monkey-patch distutils with our own build_ext class knowing
        about pycc-compiled extensions modules.
        Nc                       s   e Zd Z fddZdS )z:_CCExtension.monkey_patch_distutils.<locals>._CC_build_extc                    s$   t |tr||   | | d S r2   )
isinstancer   r   build_extension)r(   r   Z_orig_build_extr+   r,   r   -  s    

zJ_CCExtension.monkey_patch_distutils.<locals>._CC_build_ext.build_extensionN)r   r   r   r   r+   r   r+   r,   _CC_build_ext+  s   r   T)_distutils_monkey_patchedr   )clsr   r+   r   r,   r      s    z#_CCExtension.monkey_patch_distutils)	r   r   r   r   r   r   r   classmethodr   r+   r+   r+   r,   r     s   r   )
setuptoolsr   ZdutilsZsetuptools.commandr   Zsetuptools.extensionr   r!   rt   r   rp   Z
numba.corer   r   Znumba.core.compiler_lockr   Znumba.pycc.compilerr   r	   Znumba.pycc.platformr
   Znumbar   r   ri   Zget_extension_libsr   objectr   r   r+   r+   r+   r,   <module>   s"    {