σ
\K]c           @` sώ   d  d l  m Z m Z m Z 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 e f d     YZ d e
 f d     YZ d S(   i    (   t   print_functiont   divisiont   absolute_import(   t   dir_utilt   log(   t	   build_ext(   t	   ExtensionN(   t   sigutilst   typing(   t   global_compiler_locki   (   t   ModuleCompilert   ExportEntry(   t	   Toolchaint   CCc           B` sR  e  Z d  Z d d g Z i  Z i  Z d d  Z e d    Z	 e d    Z
 e
 j d    Z
 e d    Z e j d    Z e d	    Z e j d
    Z e d    Z e j d    Z e d    Z e j d    Z d   Z e d    Z d   Z d   Z d   Z d   Z d   Z e d    Z e d    Z d   Z RS(   s_   
    An ahead-of-time compiler to create extension modules that don't
    depend on Numba.
    s   modulemixin.cs   ../_math_c99.cc         C` s  d | k r t  d   n  | |  _ d | |  _ i  |  _ t j d  } | d  k rk | j } | d } n4 t | d  r | j	 } | j
 } n t j | j	 } | j d d  |  _ | |  _ t   |  _ t |  _ t j j |  j  |  _ |  j j |  |  _ t |  _ d |  _ d  S(   Nt   .s;   basename should be a simple module name, not qualified namet
   pycc_init_i   t   __name__t   __file__t    (   t
   ValueErrort	   _basenamet   _init_functiont   _exported_functionst   syst	   _getframet   Nonet	   f_globalst   hasattrt   __dict__R   t   modulest   gett   _source_patht   _source_moduleR   t
   _toolchaint   Falset   _verboset   ost   patht   dirnamet   _output_dirt   get_ext_filenamet   _output_filet   Truet   _use_nrtt   _target_cpu(   t   selft   extension_namet   source_modulet   ft   dct(    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   __init__*   s*    							c         C` s   |  j  S(   s=   
        The name of the extension module to create.
        (   R   (   R-   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   nameG   s    c         C` s   |  j  S(   sJ   
        The specific output file (a DLL) that will be generated.
        (   R)   (   R-   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   output_fileN   s    c         C` s   | |  _  d  S(   N(   R)   (   R-   t   value(    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyR4   U   s    c         C` s   |  j  S(   s?   
        The directory the output file will be put in.
        (   R'   (   R-   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt
   output_dirY   s    c         C` s   | |  _  d  S(   N(   R'   (   R-   R5   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyR6   `   s    c         C` s   |  j  S(   N(   R+   (   R-   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   use_nrtd   s    c         C` s   | |  _  d  S(   N(   R+   (   R-   R5   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyR7   h   s    c         C` s   |  j  S(   s;   
        The target CPU model for code generation.
        (   R,   (   R-   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt
   target_cpul   s    c         C` s   | |  _  d  S(   N(   R,   (   R-   R5   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyR8   s   s    c         C` s   |  j  S(   sI   
        Whether to display detailed information when compiling.
        (   R#   (   R-   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   verbosew   s    c         C` s   | |  _  d  S(   N(   R#   (   R-   R5   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyR9   ~   s    c         ` sb   t  j   \ } } t j | |      j k rI t d     n      f d   } | S(   sH   
        Mark a function for exporting in the extension module.
        s   duplicated export symbol %sc         ` s#   t     |   } |  j   <|  S(   N(   R   R   (   t   funct   entry(   t   exported_nameR-   t   sig(    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt	   decorator   s    (   R   t   normalize_signatureR   t	   signatureR   t   KeyError(   R-   R<   R=   t   fn_argst   fn_rettyR>   (    (   R<   R-   R=   s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   export   s    c         C` s   t  |  j j   d d   S(   Nt   keyc         S` s   |  j  S(   N(   t   symbol(   R;   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   <lambda>   R   (   t   sortedR   t   values(   R-   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   _export_entries   s    c         C` s[   t  j j t  } |  j } |  j r5 | j d  n  g  | D] } t  j j | |  ^ q< S(   Ns   ../runtime/nrt.c(   R$   R%   R&   R   t   _mixin_sourcesR+   t   appendt   join(   R-   t   heret   mixin_sourcesR0   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   _get_mixin_sources   s
    
	c         C` s"   d |  j  f d t |  j  f g S(   Nt   PYCC_MODULE_NAMEt   PYCC_USE_NRT(   R   t   intR+   (   R-   (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   _get_mixin_defines   s    c         C` s=   |  j  j t j g   } | s9 |  j  j t j g   } n  | S(   N(   t   _extra_cflagsR   R   t   platformR$   R3   (   R-   t   extra_cflags(    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   _get_extra_cflags₯   s    c         C` s=   |  j  j t j g   } | s9 |  j  j t j g   } n  | S(   N(   t   _extra_ldflagsR   R   RV   R$   R3   (   R-   t   extra_ldflags(    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   _get_extra_ldflags«   s    c      	   C` s^   |  j    } |  j   } |  j j   } |  j   } |  j j | | d | d | d | } | S(   Nt   include_dirst   macrosRW   (   RP   RT   R!   t   get_python_include_dirsRX   t   compile_objects(   R-   t	   build_dirt   sourcesR]   R\   RW   t   objects(    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   _compile_mixins±   s    	c         C` s   t  |  j |  j |  j d |  j } |  j | _ t j j	 | t j j
 |  j  d d  } t j d |  j |  | j | d t | g | j f S(   Nt   cpu_namei    s   .os%   generating LLVM code for '%s' into %st   wrap(   R
   RJ   R   R+   R,   R   t   external_init_functionR$   R%   RM   t   splitextR)   R   t   infot   write_native_objectR*   t   dll_exports(   R-   R`   t   compilert   temp_obj(    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   _compile_object_filesΏ   s     	c      	   C` sΛ   |  j  |  j _  t j d d |  j  } |  j |  \ } } | |  j |  7} |  j   } t j	 j
 |  j |  j  } |  j j   } |  j j   } |  j j | | | | d | d | t j |  d S(   s/   
        Compile the extension module.
        t   prefixs   pycc-build-%s-t   export_symbolsRZ   N(   R9   R!   t   tempfilet   mkdtempR   Rm   Rc   R[   R$   R%   RM   R'   R)   t   get_python_librariest   get_python_library_dirst   link_sharedt   shutilt   rmtree(   R-   R`   Rb   Rj   RZ   t
   output_dllt	   librariest   library_dirs(    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   compileΛ   s    	c   
      K` s/  | j  d g   |  j   } | j  d g   |  j g } | j  d g   |  j   } | j  d g   |  j   } | j  d g   |  j j   } | j  d g   |  j j   } | j  d g   |  j j   } t	 d |  j
 d	 |  j   d | d
 | d | d | d | d | d | |  	}	 |	 j   |  |	 _ |	 S(   s`   
        Create a distutils extension object that can be used in your
        setup.py.
        R]   t   dependst   extra_compile_argst   extra_link_argsR\   Rx   Ry   R3   Ra   t   define_macros(   t   popRT   R   RX   R[   R!   R^   Rr   Rs   t   _CCExtensionR   RP   t   monkey_patch_distutilst   _cc(
   R-   t   kwargsR]   R{   R|   R}   R\   Rx   Ry   t   ext(    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   distutils_extensionε   s2    	
	N(   R   t
   __module__t   __doc__RK   RU   RY   R   R2   t   propertyR3   R4   t   setterR6   R7   R8   R9   RD   RJ   RP   RT   RX   R[   Rc   R	   Rm   Rz   R   (    (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyR      s4   						R   c           B` s2   e  Z d  Z d Z e Z d   Z e d    Z	 RS(   sj   
    A Numba-specific Extension subclass to LLVM-compile pure Python code
    to an extension module.
    c         C` s>   |  j  } t j | j  | j | j  \ } } | |  _ d  S(   N(   R   R   t   mkpatht
   build_tempRm   t   extra_objects(   R-   R   t   ccRb   t   _(    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   _prepare_object_files  s    	c         ` sH   |  j  r d St j   d   f   f d     Y} | t _ t |  _  d S(   s}   
        Monkey-patch distutils with our own build_ext class knowing
        about pycc-compiled extensions modules.
        Nt   _CC_build_extc           ` s   e  Z   f d    Z RS(   c         ` s3   t  | t  r | j |   n    j |  |  d  S(   N(   t
   isinstanceR   R   t   build_extension(   R-   R   (   t   _orig_build_ext(    s,   lib/python2.7/site-packages/numba/pycc/cc.pyR   #  s    (   R   R   R   (    (   R   (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyR   !  s   (   t   _distutils_monkey_patchedR   R*   (   t   clsR   (    (   R   s,   lib/python2.7/site-packages/numba/pycc/cc.pyR     s    			N(
   R   R   R   R   R   R"   R   R   t   classmethodR   (    (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyR     s
   	(   t
   __future__R    R   R   t	   distutilsR   R   t   distutils.commandR   t   distutils.extensionR   R$   Ru   R   Rp   t   numbaR   R   t   numba.compiler_lockR	   Rk   R
   R   RV   R   t   objectR   R   (    (    (    s,   lib/python2.7/site-packages/numba/pycc/cc.pyt   <module>   s   υ