
`@_.              $   @   s"  d  d l  m Z d  d l m Z d  d l m Z d  d l 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 m Z y d  d l m Z Wn e k
 r e Z Yn Xy d  d	 l m Z Wn? e k
 rd  d
 l m Z e d  [ d  d l m Z Yn Xd Z d Z d Z e j d k rC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  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)    )	build_ext)	copy_file)new_compiler)customize_compiler)DistutilsError)logN)Library)_CONFIG_VARS)get_config_varLDSHARED)_config_varsFZshareddarwinTntRTLD_NOWc             C   s   t  r
 |  Sd S)N )	have_rtld)s r   B/tmp/pip-build-tw3_dw7d/setuptools/setuptools/command/build_ext.py<lambda>+   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   .   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   r   r   _needs_stub
write_stubcurdir)
r   r   extfullnamefilenameZmodpathpackagepackage_dirZdest_filenameZsrc_filenamer   r   r   r   6   s    
	z#build_ext.copy_extensions_to_sourcec             C   s   t  j |  |  } | |  j k r |  j | } t | t  rh t j j |  \ } } |  j j	 | t
  St r | j r t j j |  \ } } t j j | d |  S| S)Nzdl-)r   r$   ext_map
isinstancer   r'   r(   splitextshlib_compilerlibrary_filenamelibtype	use_stubs_links_to_dynamicr%   r&   )r   r/   r0   r.   fndr   r   r   r$   L   s    zbuild_ext.get_ext_filenamec             C   s,   t  j |   d  |  _ g  |  _ i  |  _ d  S)N)r   initialize_optionsr6   shlibsr3   )r   r   r   r   r=   X   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   )r4   r   ).0r.   r   r   r   
<listcomp>b   s   	 z.build_ext.finalize_options.<locals>.<listcomp>r   r   Fr   )r   finalize_optionsr!   Zcheck_extensions_listr>   setup_shlib_compilerr"   r#   
_full_namer3   r%   links_to_dynamicr9   r4   r   r:   r+   r$   
_file_namer'   r(   dirnamer&   r*   library_dirsappendr-   runtime_library_dirs)r   r.   r/   Zltdnsr0   Zlibdirr   r   r   rA   ^   s,    	
			$zbuild_ext.finalize_optionsc             C   s  t  d |  j d |  j d |  j  } |  _ t j d k r t j   } z, d t d <d t d <d	 t d
 <t	 |  Wd  t j
   t j |  Xn
 t	 |  |  j d  k	 r | j |  j  |  j d  k	 r x' |  j D] \ } } | j | |  q W|  j d  k	 r"x |  j D] } | j |  qW|  j d  k	 rA| j |  j  |  j d  k	 r`| j |  j  |  j d  k	 r| j |  j  |  j d  k	 r| j |  j  t j |  | _ d  S)Ncompilerr   forcer   z0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupr   z -dynamiclibCCSHAREDz.dylibSO)r   rK   r   rL   r6   sysplatformr	   copyr   clearupdateinclude_dirsZset_include_dirsZdefineZdefine_macroZundefZundefine_macro	librariesZset_librariesrG   Zset_library_dirsZrpathZset_runtime_library_dirsZlink_objectsZset_link_objectslink_shared_object__get__)r   rK   tmpr#   valueZmacror   r   r   rB   {   s:    %




zbuild_ext.setup_shlib_compilerc             C   s&   t  | t  r | j St j |  |  S)N)r4   r   export_symbolsr   get_export_symbols)r   r.   r   r   r   r[      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_langrK   r4   r   r6   r   build_extensionr+   r    r*   r,   )r   r.   Z	_compilercmdr   r   r   r\      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   )rC   )r?   libr   r   r   r@      s   	 z.build_ext.links_to_dynamic.<locals>.<listcomp>r   Nr   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>r   )dictfromkeysr>   r&   rC   r%   anyrU   )r   r.   r   )r`   ra   r   rD      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   rf      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*   rC   r%   )r?   r.   )r   r   r   rb      s   z0build_ext.__get_stubs_outputs.<locals>.<genexpr>c             s   s   |  ] \ } } | | Vq d  S)Nr   )r?   baseZfnextr   r   r   rb      s    )r!   	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)r    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_compilern   rL   Tr   install_lib)r   inforC   r'   r(   r&   r%   existsr   r   openwriteif_dlr)   rE   closedistutils.utilrq   r    rn   unlink)r   
output_dirr.   compileZ	stub_filefrq   rn   r   r   r   r,      sP    				
zbuild_ext.write_stubN)__name__
__module____qualname__r   r   r$   r=   rA   rB   r[   r\   rD   rf   rg   rk   r,   r   r   r   r   r   -   s   (	r   c             C   s8   |  j  |  j | | | | | | | | |	 |
 | |  d  S)N)linkZSHARED_LIBRARY)r   objectsoutput_libnamer{   rU   rG   rI   rZ   debugextra_preargsextra_postargs
build_temptarget_langr   r   r   rV     s
    rV   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xr^      )AssertionErrorr'   r(   r%   r5   r7   
startswithZcreate_static_lib)r   r   r   r{   rU   rG   rI   rZ   r   r   r   r   r   r0   r)   r.   r   r   r   rV     s    )"Zdistutils.command.build_extr   Z_du_build_extdistutils.file_utilr   distutils.ccompilerr   distutils.sysconfigr   Zdistutils.errorsr   	distutilsr   r'   rO   ri   Zsetuptools.extensionr   ZCython.Distutils.build_extr   ImportError	sysconfigr	   r
   r   r   r9   r8   rP   r#   dlhasattrrw   rV   r   r   r   r   <module>   sV   
				