U
    ,dJ)                     @   s   d dl mZ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 ZG d
d deZG dd deZdS )    )dir_utillog)	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,   1/tmp/pip-unpacked-wheel-eu7e0c37/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-   nameI   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_fileP   s    zCC.output_filec                 C   s
   || _ d S Nr1   r)   valuer,   r,   r-   r2   W   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 r3   r6   r4   r,   r,   r-   r7   b   s    c                 C   s   | j S r3   r'   r/   r,   r,   r-   use_nrtf   s    z
CC.use_nrtc                 C   s
   || _ d S r3   r8   r4   r,   r,   r-   r9   j   s    c                 C   s   | j S )z;
        The target CPU model for code generation.
        r(   r/   r,   r,   r-   
target_cpun   s    zCC.target_cpuc                 C   s
   || _ d S r3   r:   r4   r,   r,   r-   r;   u   s    c                 C   s   | j S )zI
        Whether to display detailed information when compiling.
        r!   r/   r,   r,   r-   verbosey   s    z
CC.verbosec                 C   s
   || _ d S r3   r<   r4   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 r3   )r
   r   )funcentryexported_namer)   sigr,   r-   	decorator   s    
zCC.export.<locals>.decorator)r   Znormalize_signaturer   	signaturer   KeyError)r)   rA   rB   Zfn_argsZfn_rettyrC   r,   r@   r-   export   s    
z	CC.exportc                 C   s   t | j dd dS )Nc                 S   s   | j S r3   )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.cc                    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,   rP   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 r3   )_extra_cflagsr   r   platformr"   r0   )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   rY   r"   r0   
startswithrT   )r)   extra_ldflagsr,   r,   r-   _get_extra_ldflags   s    
zCC._get_extra_ldflagsc                 C   s<   |   }|  }| j }|  }| jj|||||d}|S )N)include_dirsmacrosrZ   )rU   rW   r    get_python_include_dirsr[   Zcompile_objects)r)   	build_dirsourcesrb   ra   rZ   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	   rM   r   r'   r(   r   Zexternal_init_functionr"   r#   rN   splitextr&   r   infoZwrite_native_objectdll_exports)r)   rd   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   rg   r`   r"   r#   rN   r%   r&   get_python_librariesget_python_library_dirsZlink_sharedshutilrmtree)r)   rd   rf   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.
        rb   dependsextra_compile_argsextra_link_argsra   rv   rw   Nr   r   )	r0   re   ry   define_macrosra   rv   rw   rz   r{   )poprW   r   r[   r`   r    rc   rr   rs   r   rfind_CCExtensionr   rU   monkey_patch_distutils_cc)r)   kwargsrb   ry   rz   r{   ra   rv   rw   Zpython_package_pathextr,   r,   r-   distutils_extension   sB    




	
zCC.distutils_extension)N)r   
__module____qualname____doc__extension_libsrS   rX   r]   r.   propertyr0   r2   setterr7   r9   r;   r=   rF   rM   rU   rW   r[   r`   rg   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   r   mkpathr"   r#   rN   
build_tempr0   splitrm   extra_objects)r)   r   ccrf   _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 r3   )
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   )	distutilsr   r   distutils.commandr   distutils.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   Zget_extension_libsr   objectr   r   r,   r,   r,   r-   <module>   s    {