o
    8ήcJ)                     @   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|v rt d|| _d| | _i | _td}|d u r$|j}|d }nt|dr0|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 name
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_dirget_ext_filename_output_file_use_nrt_target_cpu)selfextension_namesource_modulefdct r0   4/tmp/pip-target-vg8gfxp4/lib/python/numba/pycc/cc.py__init__,   s*   




zCC.__init__c                 C      | j S )z=
        The name of the extension module to create.
        )r   r+   r0   r0   r1   nameI      zCC.namec                 C   r3   )zJ
        The specific output file (a DLL) that will be generated.
        r(   r4   r0   r0   r1   output_fileP   r6   zCC.output_filec                 C   
   || _ d S Nr7   r+   valuer0   r0   r1   r8   W      
c                 C   r3   )z?
        The directory the output file will be put in.
        r&   r4   r0   r0   r1   
output_dir[   r6   zCC.output_dirc                 C   r9   r:   r>   r;   r0   r0   r1   r?   b   r=   c                 C   r3   r:   r)   r4   r0   r0   r1   use_nrtf   s   z
CC.use_nrtc                 C   r9   r:   r@   r;   r0   r0   r1   rA   j   r=   c                 C   r3   )z;
        The target CPU model for code generation.
        r*   r4   r0   r0   r1   
target_cpun   r6   zCC.target_cpuc                 C   r9   r:   rB   r;   r0   r0   r1   rC   u   r=   c                 C   r3   )zI
        Whether to display detailed information when compiling.
        r"   r4   r0   r0   r1   verbosey   r6   z
CC.verbosec                 C   r9   r:   rD   r;   r0   r0   r1   rE      r=   c                    sJ   t \}}tj|g|R   jv rtd   fdd}|S )zH
        Mark a function for exporting in the extension module.
        zduplicated export symbol %sc                    s   t  | }|j < | S r:   )r
   r   )funcentryexported_namer+   sigr0   r1   	decorator   s   
zCC.export.<locals>.decorator)r   normalize_signaturer   	signaturer   KeyError)r+   rI   rJ   fn_argsfn_rettyrK   r0   rH   r1   export   s   
z	CC.exportc                 C   s   t | j dd dS )Nc                 S   r3   r:   )symbol)rG   r0   r0   r1   <lambda>   s    z$CC._export_entries.<locals>.<lambda>)key)sortedr   valuesr4   r0   r0   r1   _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 r0   )r#   r$   join).0r.   herer0   r1   
<listcomp>   s    z)CC._get_mixin_sources.<locals>.<listcomp>)r#   r$   r%   r   _mixin_sourcesr)   append)r+   mixin_sourcesr0   rZ   r1   _get_mixin_sources   s
   
zCC._get_mixin_sourcesc                 C   s   d| j fdt| jfgS )NPYCC_MODULE_NAMEPYCC_USE_NRT)r   intr)   r4   r0   r0   r1   _get_mixin_defines   s   zCC._get_mixin_definesc                 C   s(   | j tjg }|s| j tjg }|S r:   )_extra_cflagsr   r   platformr#   r5   )r+   extra_cflagsr0   r0   r1   _get_extra_cflags   s   zCC._get_extra_cflagsc                 C   sF   | j tjg }|s| j tjg }tjdr!d|vr!|d |S )Nlinuxz-pthread)_extra_ldflagsr   r   rf   r#   r5   
startswithr^   )r+   extra_ldflagsr0   r0   r1   _get_extra_ldflags   s   
zCC._get_extra_ldflagsc                 C   s<   |   }|  }| j }|  }| jj|||||d}|S )N)include_dirsmacrosrg   )r`   rd   r!   get_python_include_dirsrh   compile_objects)r+   	build_dirsourcesro   rn   rg   objectsr0   r0   r1   _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)cpu_namer   z.oz%generating LLVM code for '%s' into %sT)wrap)r	   rW   r   r)   r*   r   external_init_functionr#   r$   rX   splitextr(   r   infowrite_native_objectdll_exports)r+   rr   compilertemp_objr0   r0   r1   _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_symbolsrl   N)rE   r!   tempfilemkdtempr   r   ru   rm   r#   r$   rX   r&   r(   get_python_librariesget_python_library_dirslink_sharedshutilrmtree)r+   rr   rt   r|   rl   
output_dll	librarieslibrary_dirsr0   r0   r1   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d|	| j |  |||||||d	|}
|
  | |
_|
S )z`
        Create a distutils extension object that can be used in your
        setup.py.
        ro   dependsextra_compile_argsextra_link_argsrn   r   r   Nr   r   )	r5   rs   r   define_macrosrn   r   r   r   r   r0   )poprd   r   rh   rm   r!   rp   r   r   r    rfind_CCExtensionr   r`   monkey_patch_distutils_cc)r+   kwargsro   r   r   r   rn   r   r   python_package_pathextr0   r0   r1   distutils_extension   sB   




	
zCC.distutils_extensionr:   )r   
__module____qualname____doc__extension_libsr]   re   rj   r2   propertyr5   r8   setterr?   rA   rC   rE   rQ   rW   r`   rd   rh   rm   ru   r   r   r   r   r0   r0   r0   r1   r      sR    
















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   sL   | j }ttjj|jg| jdd d R   |	|j\}}|| _
d S )Nr   )r   r   mkpathr#   r$   rX   
build_tempr5   splitr   extra_objects)r+   r   ccrt   _r0   r0   r1   _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 r:   )
isinstancer   r   build_extension)r+   r   _orig_build_extr0   r1   r   *  s   

zJ_CCExtension.monkey_patch_distutils.<locals>._CC_build_ext.build_extensionN)r   r   r   r   r0   r   r0   r1   _CC_build_ext(  s    r   T)_distutils_monkey_patchedr   )clsr   r0   r   r1   r     s   
z#_CCExtension.monkey_patch_distutils)	r   r   r   r   r   r   r   classmethodr   r0   r0   r0   r1   r     s    r   )	distutilsr   r   distutils.commandr   distutils.extensionr   r#   r   r   r   
numba.corer   r   numba.core.compiler_lockr   numba.pycc.compilerr	   r
   numba.pycc.platformr   numbar   get_extension_libsr   objectr   r   r0   r0   r0   r1   <module>   s      {