3

g2                 @   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rd dlZd
d ej D Znd dlmZ yd dlmZ ed W n ek
r   eZY nX ed d dl
mZ dd Z dZ!dZ"dZ#ej$dkrdZ"n>e j%dkrTyd dl&Z&e'e&d Z"Z!W n ek
rR   Y nX dd Z(dd Z)G dd deZe"se j%dkrd"ddZ*nd Z#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   @/tmp/pip-unpacked-wheel-2ahgb425/setuptools/command/build_ext.py
<listcomp>   s    r   )EXTENSION_SUFFIXESzCython.Compiler.MainLDSHARED)_config_varsc             C   sZ   t jdkrNtj }z$dtd< dtd< dtd< t|  W d tj  tj| X n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| S dS )N )	have_rtld)r   r   r   r   <lambda>D   s    r'   c              C   s*   x$t D ]} d| kr| S | dkr| S qW dS )z;Return the file extension for an abi3-compliant Extension()z.abi3z.pydN)r   )suffixr   r   r   get_abi3_suffixG   s
    
r)   c               @   sv   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|  || _ |r*| 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+   Q   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|	|| j| jd |jr| j|ptj|d qW d 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,   Y   s    




z#build_ext.copy_extensions_to_sourcec             C   s   t j| |}|| jkr| j| }tj o6t|do6t }|r`td}|d t|  }|t  }t	|t
rtjj|\}}| jj|tS tr|jrt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   o   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   s2  t j|  | jpg | _| j| j dd | jD | _| jrB| j  x| jD ]}| j|j|_qJW x| jD ]}|j}|| j	|< || j	|j
dd < | jr| j|pd}|otot|t }||_||_| j| }|_tjjtjj| j|}|o||jkr|jj| |rhtrhtj|jkrh|jjtj qhW d S )Nc             S   s   g | ]}t |tr|qS r   )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   libdirr   r   r   rW      s,    

zbuild_ext.finalize_optionsc             C   s   t | j| j| jd }| _t| | jd k	r8|j| j | jd k	rbx| jD ]\}}|j	|| qJW | j
d k	rx| j
D ]}|j| qtW | jd k	r|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)r    r2   force)r   r    r2   rb   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   valueZmacror   r   r   rX      s(    






zbuild_ext.setup_shlib_compilerc             C   s   t |tr|jS t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}z@t|tr"| j| _tj| | |jrL| jdj	}| j
|| W d || _X d 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                sP   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S r   )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   Zlibname)libnamespkgr   r   	<genexpr>   s    z-build_ext.links_to_dynamic.<locals>.<genexpr>r3   )dictfromkeysrV   r:   rY   r9   anyrd   )r-   rB   r   )rm   rn   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   rs      s    zbuild_ext.get_outputsc                s6    fdd j D }tj| j }tdd |D S )Nc             3   s0   | ](}|j rtjj jf|jjd  V  qdS )r/   N)r?   r;   r<   r:   r>   rY   r9   )r   rB   )r-   r   r   ro      s   z0build_ext.__get_stubs_outputs.<locals>.<genexpr>c             s   s   | ]\}}|| V  qd S )Nr   )r   baseZfnextr   r   r   ro      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|f|jjd d }|rJtjj|rJt|d | j	st
|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| j	d | jdj}|dkr||g|d| j	d 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_compileT)r{   rb   r2   install_lib)r   inforY   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)F)__name__
__module____qualname__r+   r,   r8   rU   rW   rX   ri   rj   rZ   rs   rt   rx   r@   r   r   r   r   r   P   s   	r   c             C   s(   | j | j|||||||||	|
|| d S )N)linkZSHARED_LIBRARY)r-   objectsoutput_libnamer   rd   r]   r_   rh   debugextra_preargsextra_postargs
build_temptarget_langr   r   r   re   #  s
    re   Zstaticc             C   s^   |d kst tjj|\}}tjj|\}}| jdjdrH|dd  }| j||||| d S )Nxrl      )AssertionErrorr;   r<   r9   rM   rO   
startswithZcreate_static_lib)r-   r   r   r   rd   r]   r_   rh   r   r   r   r   r   rD   r=   rB   r   r   r   re   2  s    )
NNNNNr   NNNN)
NNNNNr   NNNN)+r;   r   rv   Zdistutils.command.build_extr   Z_du_build_extdistutils.file_utilr   distutils.ccompilerr   distutils.sysconfigr   r   distutils.errorsr   	distutilsr   Zsetuptools.extensionr	   Zsetuptools.externr
   rI   r   Zget_suffixesr   importlib.machineryZCython.Distutils.build_extr*   
__import__ImportErrorr   r   r"   r&   rQ   rP   r   r7   dlhasattrr   r)   re   r   r   r   r   <module>   s^   
	 Q   	   