
(h3                 @   s_  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	 d  d l
 m Z m Z d  d l m Z d  d l m Z d  d l m Z d  d	 l m Z e j r d  d l Z d
 d   e j   D Z n d  d l m Z y d  d l m Z e d  Wn e k
 r#e Z Yn Xe d  d  d l
 m Z d d   Z  d Z! d Z" d Z# e j$ d k rtd Z" nG e  j% d k ry# d  d l& Z& e' e& d  Z" Z! Wn e k
 rYn Xd d   Z( d d   Z) Gd d   d e  Z e" se  j% d k r+d d d d d d  d d d d d d 
 Z* n0 d  Z# d d d d d d  d d d d d! d 
 Z* d S)"    N)	build_ext)	copy_file)new_compiler)customize_compilerget_config_var)DistutilsError)log)Library)sixc             C   s.   g  |  ]$ \ } } } | t  j k r |  q S )impC_EXTENSION).0s_tpr   r   B/tmp/pip-build-kmztzv_d/setuptools/setuptools/command/build_ext.py
<listcomp>   s   	 r   )EXTENSION_SUFFIXESzCython.Compiler.MainLDSHARED)_config_varsc             C   ss   t  j d k re t j   } z, d t d <d t d <d t d <t |   Wd  t j   t j |  Xn
 t |   d  S)Ndarwinz0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupr   z -dynamiclibCCSHAREDz.dylibSO)sysplatform_CONFIG_VARScopyr   clearupdate)compilertmpr   r   r   _customize_compiler_for_shlib$   s    



r"   FZsharedr   TntRTLD_NOWc             C   s   t  r
 |  Sd S)N )	have_rtld)r   r   r   r   if_dlF   s    r'   c              C   s5   x. t  D]& }  d |  k r |  S|  d k r |  Sq Wd S)z;Return the file extension for an abi3-compliant Extension()z.abi3z.pydN)r   )suffixr   r   r   get_abi3_suffixJ   s
    r)   c               @   s   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d d  Z d S)r   c             C   s=   |  j  d } |  _  t j |   | |  _  | r9 |  j   d S)z;Build extensions in build directory, then copy if --inplacer   N)Zinplace
_build_extruncopy_extensions_to_source)selfZold_inplacer   r   r   r+   T   s
    	zbuild_ext.runc       
      C   s   |  j  d  } x |  j D] } |  j | j  } |  j |  } | j d  } d j | d  d   } | j |  } t j	 j | t j	 j
 |   } t j	 j |  j |  }	 t |	 | d |  j d |  j | j r |  j | p t j | d  q Wd  S)Nbuild_py.   verbosedry_runT)get_finalized_command
extensionsget_ext_fullnamenameget_ext_filenamesplitjoinZget_package_dirospathbasename	build_libr   r1   r2   _needs_stub
write_stubcurdir)
r-   r.   extfullnamefilenameZmodpathpackagepackage_dirZdest_filenameZsrc_filenamer   r   r   r,   \   s    
	z#build_ext.copy_extensions_to_sourcec             C   s  t  j |  |  } | |  j k r |  j | } t j oM t | d  oM t   } | r t d  } | d  t |   } | t   } t	 | t
  r t j j |  \ } } |  j j | t  St r | j r t j j |  \ } } t j j | d |  S| S)NZpy_limited_api
EXT_SUFFIXzdl-)r*   r8   ext_mapr
   PY2getattrr)   r   len
isinstancer	   r;   r<   splitextshlib_compilerlibrary_filenamelibtype	use_stubs_links_to_dynamicr9   r:   )r-   rC   rD   rB   Zuse_abi3Zso_extfndr   r   r   r8   r   s"    
	zbuild_ext.get_ext_filenamec             C   s,   t  j |   d  |  _ g  |  _ i  |  _ d  S)N)r*   initialize_optionsrN   shlibsrH   )r-   r   r   r   rU      s    		zbuild_ext.initialize_optionsc             C   s  t  j |   |  j p g  |  _ |  j |  j  d d   |  j D |  _ |  j r[ |  j   x& |  j D] } |  j | j  | _ qe Wx|  j D]} | j } | |  j	 | <| |  j	 | j
 d  d <|  j r |  j |  p d } | o t o t | t  } | | _ | | _ |  j |  } | _ t j j t j j |  j |   } | ro| | j k ro| j j |  | r t r t j | j k r | j j t j  q Wd  S)Nc             S   s%   g  |  ] } t  | t  r |  q Sr   )rL   r	   )r   rB   r   r   r   r      s   	 z.build_ext.finalize_options.<locals>.<listcomp>r/   r0   Fr3   )r*   finalize_optionsr5   Zcheck_extensions_listrV   setup_shlib_compilerr6   r7   
_full_namerH   r9   links_to_dynamicrQ   rL   r	   rR   r?   r8   
_file_namer;   r<   dirnamer:   r>   library_dirsappendrA   runtime_library_dirs)r-   rB   rC   ZltdnsrD   Zlibdirr   r   r   rW      s,    	
			$zbuild_ext.finalize_optionsc             C   sO  t  d |  j d |  j d |  j  } |  _ t |  |  j d  k	 rT | j |  j  |  j d  k	 r x' |  j D] \ } } | j	 | |  qm W|  j
 d  k	 r x |  j
 D] } | j |  q W|  j d  k	 r | j |  j  |  j d  k	 r | j |  j  |  j d  k	 r| j |  j  |  j d  k	 r9| j |  j  t j |  | _ d  S)Nr    r2   force)r   r    r2   ra   rN   r"   include_dirsZset_include_dirsZdefineZdefine_macroZundefZundefine_macro	librariesZset_librariesr]   Zset_library_dirsZrpathZset_runtime_library_dirsZlink_objectsZset_link_objectslink_shared_object__get__)r-   r    r7   valuemacror   r   r   rX      s(    %
zbuild_ext.setup_shlib_compilerc             C   s&   t  | t  r | j St j |  |  S)N)rL   r	   export_symbolsr*   get_export_symbols)r-   rB   r   r   r   ri      s    zbuild_ext.get_export_symbolsc             C   s~   | j    |  j } zZ t | t  r1 |  j |  _ t j |  |  | j rl |  j d  j	 } |  j
 | |  Wd  | |  _ Xd  S)Nr.   )Z_convert_pyx_sources_to_langr    rL   r	   rN   r*   build_extensionr?   r4   r>   r@   )r-   rB   Z	_compilercmdr   r   r   rj      s    
		zbuild_ext.build_extensionc                sn   t  j d d   |  j D    d j | j j d  d d	  d g   t    f d d   | j D  S)
z?Return true if 'ext' links to a dynamic lib in the same packagec             S   s   g  |  ] } | j   q Sr   )rY   )r   libr   r   r   r      s   	 z.build_ext.links_to_dynamic.<locals>.<listcomp>r/   Nr0   r%   c             3   s   |  ] }  |   k Vq d  S)Nr   )r   libname)libnamespkgr   r   	<genexpr>   s    z-build_ext.links_to_dynamic.<locals>.<genexpr>r3   )dictfromkeysrV   r:   rY   r9   anyrc   )r-   rB   r   )rn   ro   r   rZ      s    ,zbuild_ext.links_to_dynamicc             C   s   t  j |   |  j   S)N)r*   get_outputs_build_ext__get_stubs_outputs)r-   r   r   r   rt      s    zbuild_ext.get_outputsc                sK     f d d     j  D } t j |   j    } t d d   | D  S)Nc             3   s<   |  ]2 } | j  r t j j   j | j j d    Vq d S)r/   N)r?   r;   r<   r:   r>   rY   r9   )r   rB   )r-   r   r   rp      s   z0build_ext.__get_stubs_outputs.<locals>.<genexpr>c             s   s   |  ] \ } } | | Vq d  S)Nr   )r   baseZfnextr   r   r   rp      s    )r5   	itertoolsproduct!_build_ext__get_output_extensionslist)r-   Zns_ext_basespairsr   )r-   r   Z__get_stubs_outputs   s    zbuild_ext.__get_stubs_outputsc             c   s%   d Vd V|  j  d  j r! d Vd  S)Nz.pyz.pycr.   z.pyo)r4   optimize)r-   r   r   r   Z__get_output_extensions   s    z!build_ext.__get_output_extensionsFc             C   s  t  j d | j |  t j j | | j j d   d } | rc t j j |  rc t | d   |  j	 s	t
 | d  } | j d j d d d	 t d
  d t j j | j  d d d t d  d d d t d  d d d d d t d  d d d g   | j   | rd d l m } | | g d d d  d! d" |  j	 |  j d#  j } | d k r| | g d | d  d! d" |  j	 t j j |  r|  j	 rt j |  d  S)$Nz writing stub loader for %s to %sr/   z.pyz already exists! Please delete.w
zdef __bootstrap__():z-   global __bootstrap__, __file__, __loader__z0   import sys, os, pkg_resources, importlib.utilz, dlz:   __file__ = pkg_resources.resource_filename(__name__,%r)z   del __bootstrap__z    if '__loader__' in globals():z       del __loader__z#   old_flags = sys.getdlopenflags()z   old_dir = os.getcwd()z   try:z(     os.chdir(os.path.dirname(__file__))z$     sys.setdlopenflags(dl.RTLD_NOW)z3     spec = importlib.util.spec_from_file_location(z#                __name__, __file__)z0     mod = importlib.util.module_from_spec(spec)z!     spec.loader.exec_module(mod)z   finally:z"     sys.setdlopenflags(old_flags)z     os.chdir(old_dir)z__bootstrap__()r%   r   )byte_compiler|   ra   Tr2   install_lib)r   inforY   r;   r<   r:   r9   existsr   r2   openwriter'   r=   r[   closedistutils.utilr   r4   r|   unlink)r-   
output_dirrB   compileZ	stub_filefr   r|   r   r   r   r@      sX    	
			
zbuild_ext.write_stubN)__name__
__module____qualname__r+   r,   r8   rU   rW   rX   ri   rj   rZ   rt   ru   ry   r@   r   r   r   r   r   S   s   	r   c             C   s8   |  j  |  j | | | | | | | | |	 |
 | |  d  S)N)linkZSHARED_LIBRARY)r-   objectsoutput_libnamer   rc   r]   r_   rh   debugextra_preargsextra_postargs
build_temptarget_langr   r   r   rd   *  s
    rd   Zstaticc             C   s   | d  k s t   t j j |  \ } } t j j |  \ } } |  j d  j d  rj | d d   } |  j | | | | |  d  S)Nxrl      )AssertionErrorr;   r<   r9   rM   rO   
startswithZcreate_static_lib)r-   r   r   r   rc   r]   r_   rh   r   r   r   r   r   rD   r=   rB   r   r   r   rd   9  s    )+r;   r   rw   Zdistutils.command.build_extr   Z_du_build_extdistutils.file_utilr   distutils.ccompilerr   distutils.sysconfigr   r   Zdistutils.errorsr   	distutilsr   Zsetuptools.extensionr	   Zsetuptools.externr
   rI   r   get_suffixesr   importlib.machineryZCython.Distutils.build_extr*   
__import__ImportErrorr   r   r"   r&   rQ   rP   r   r7   dlhasattrr'   r)   rd   r   r   r   r   <module>   s\   	
					