
|_2                 @   s,  d  d l  Z  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 y d  d l m Z 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 r5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 d   Z& d S)     N)	build_ext)	copy_file)new_compiler)customize_compilerget_config_var)DistutilsError)log)Library)six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tmp r   B/tmp/pip-build-3_sjtvrs/setuptools/setuptools/command/build_ext.py_customize_compiler_for_shlib   s    



r   FZsharedr   TntRTLD_NOWc             C   s   t  r
 |  Sd S)N )	have_rtld)sr   r   r   <lambda>;   s    r    c              C   sQ   xJ d d   t  j   D D]/ \ }  } } d |  k r9 |  S|  d k r |  Sq Wd S)z;Return the file extension for an abi3-compliant Extension()c             s   s(   |  ] } | d  t  j k r | Vq d S)   N)impC_EXTENSION).0r   r   r   r   	<genexpr>@   s    z"get_abi3_suffix.<locals>.<genexpr>z.abi3z.pydN)r"   get_suffixes)suffix_r   r   r   get_abi3_suffix>   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+   H   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,   P   s    
	z#build_ext.copy_extensions_to_sourcec             C   s  t  j |  |  } | |  j k r |  j | } t j oL t | d  oL 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
   PY3getattrr)   _get_config_var_837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   f   s"    		zbuild_ext.get_ext_filenamec             C   s,   t  j |   d  |  _ g  |  _ i  |  _ d  S)N)r*   initialize_optionsrO   shlibsrH   )r-   r   r   r   rV   {   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   )rM   r	   )r$   rB   r   r   r   
<listcomp>   s   	 z.build_ext.finalize_options.<locals>.<listcomp>r/   r0   Fr3   )r*   finalize_optionsr5   Zcheck_extensions_listrW   setup_shlib_compilerr6   r7   
_full_namerH   r9   links_to_dynamicrR   rM   r	   rS   r?   r8   
_file_namer;   r<   dirnamer:   r>   library_dirsappendrA   runtime_library_dirs)r-   rB   rC   ZltdnsrD   Zlibdirr   r   r   rY      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   rc   rO   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   valueZmacror   r   r   rZ      s(    %
zbuild_ext.setup_shlib_compilerc             C   s&   t  | t  r | j St j |  |  S)N)rM   r	   export_symbolsr*   get_export_symbols)r-   rB   r   r   r   rj      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   rM   r	   rO   r*   build_extensionr?   r4   r>   r@   )r-   rB   Z	_compilercmdr   r   r   rk      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   )r[   )r$   libr   r   r   rX      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   r%      s    z-build_ext.links_to_dynamic.<locals>.<genexpr>r3   )dictfromkeysrW   r:   r[   r9   anyre   )r-   rB   r   )ro   rp   r   r\      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>   r[   r9   )r$   rB   )r-   r   r   r%      s   z0build_ext.__get_stubs_outputs.<locals>.<genexpr>c             s   s   |  ] \ } } | | Vq d  S)Nr   )r$   baseZfnextr   r   r   r%      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 t d  d d d g   | j   | rd d l m } | | g d d d d d |  j	 |  j d   j } | d k rx| | 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__z%   import sys, os, pkg_resources, impz, 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)z(     imp.load_dynamic(__name__,__file__)z   finally:z"     sys.setdlopenflags(old_flags)z     os.chdir(old_dir)z__bootstrap__()r   r   )byte_compiler|   rc   Tr2   install_lib)r   infor[   r;   r<   r:   r9   existsr   r2   openwriteif_dlr=   r]   closedistutils.utilr   r4   r|   unlink)r-   
output_dirrB   compileZ	stub_filefr   r|   r   r   r   r@      sP    				
zbuild_ext.write_stubN)__name__
__module____qualname__r+   r,   r8   rV   rY   rZ   rj   rk   r\   rt   ru   ry   r@   r   r   r   r   r   G   s   	r   c             C   s8   |  j  |  j | | | | | | | | |	 |
 | |  d  S)N)linkZSHARED_LIBRARY)r-   objectsoutput_libnamer   re   r_   ra   ri   debugextra_preargsextra_postargs
build_temptarget_langr   r   r   rf     s
    rf   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xrm      )AssertionErrorr;   r<   r9   rN   rP   
startswithZcreate_static_lib)r-   r   r   r   re   r_   ra   ri   r   r   r   r   r   rD   r=   rB   r   r   r   rf   )  s    c             C   s   t  j d k  r d }  t |   S)z
    In https://github.com/pypa/setuptools/pull/837, we discovered
    Python 3.3.0 exposes the extension suffix under the name 'SO'.
    r   r0   r   )r   r   r0   )r   version_infor   )r7   r   r   r   rK   A  s    rK   )'r;   r   rw   r"   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
   ZCython.Distutils.build_extr*   ImportErrorr   r   r   r   rR   rQ   r   r7   dlhasattrr   r)   rf   rK   r   r   r   r   <module>   sV   
					