B
    ãUvga2  ã            
   @   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 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�r,yd dl"Z"e#e"dƒ ZZW n ek
�r*   Y nX dd„ Z$dd„ Z%G dd„ deƒZe�s^e j!dk�rjd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)ÚsixzCython.Compiler.MainÚLDSHARED)Ú_config_varsc          	   C   sZ   t jdkrNt ¡ }z$dtd< dtd< dtd< t| ƒ W d t ¡  t |¡ 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Útmp© r   úD/tmp/pip-install-r_9ig3yj/setuptools/setuptools/command/build_ext.pyÚ_customize_compiler_for_shlib   s    
r   FZsharedr   TÚntÚRTLD_NOWc             C   s   t r| S dS )NÚ )Ú	have_rtld)Úsr   r   r   Ú<lambda>>   ó    r    c              C   s>   x8dd„ t  ¡ D ƒD ]"\} }}d| kr*| S | dkr| S qW d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>C   s    z"get_abi3_suffix.<locals>.<genexpr>z.abi3z.pydN)r#   Zget_suffixes)ÚsuffixÚ_r   r   r   Úget_abi3_suffixA   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 | ¡ || _ |r*|  ¡  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+   K   s
    
zbuild_ext.runc       
      C   s®   |   d¡}xž| jD ]”}|  |j¡}|  |¡}| d¡}d |d d… ¡}| |¡}tj	 |tj	 
|¡¡}tj	 | j|¡}	t|	|| j| jd� |jr|  |pžt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,   S   s    




z#build_ext.copy_extensions_to_sourcec             C   s¶   t  | |¡}|| jkr²| j| }tjo4t|dƒo4tƒ }|r^tdƒ}|d t|ƒ … }|tƒ  }t	|t
ƒr†tj |¡\}}| j |t¡S tr²|jr²tj |¡\}}tj |d| ¡S |S )NZpy_limited_apiÚ
EXT_SUFFIXzdl-)r*   r7   Úext_mapr
   ÚPY3Úgetattrr)   r   ÚlenÚ
isinstancer	   r:   r;   ÚsplitextÚshlib_compilerÚlibrary_filenameÚlibtypeÚ	use_stubsÚ_links_to_dynamicr8   r9   )r-   rB   rC   rA   Zuse_abi3Zso_extÚfnÚdr   r   r   r7   i   s"    





zbuild_ext.get_ext_filenamec             C   s    t  | ¡ d | _g | _i | _d S )N)r*   Úinitialize_optionsrM   ÚshlibsrG   )r-   r   r   r   rT   ~   s    
zbuild_ext.initialize_optionsc             C   s4  t  | ¡ | jpg | _|  | j¡ dd„ | jD ƒ| _| jrB|  ¡  x| jD ]}|  |j¡|_qJW xÎ| jD ]Ä}|j}|| j	|< || j	| 
d¡d < | jr |  |¡p¢d}|o¶to¶t|tƒ }||_||_|  |¡ }|_tj tj | j|¡¡}|�r
||jk�r
|j |¡ |rhtrhtj|jkrh|j tj¡ qhW d S )Nc             S   s   g | ]}t |tƒr|‘qS r   )rK   r	   )r%   rA   r   r   r   ú
<listcomp>ˆ   s    z.build_ext.finalize_options.<locals>.<listcomp>r/   r0   F)r*   Úfinalize_optionsr4   Zcheck_extensions_listrU   Úsetup_shlib_compilerr5   r6   Ú
_full_namerG   r8   Úlinks_to_dynamicrP   rK   r	   rQ   r>   r7   Ú
_file_namer:   r;   Údirnamer9   r=   Úlibrary_dirsÚappendr@   Úruntime_library_dirs)r-   rA   rB   ZltdÚnsrC   Zlibdirr   r   r   rW   „   s,    

zbuild_ext.finalize_optionsc             C   sî   t | j| j| jd� }| _t|ƒ | jd k	r8| | j¡ | jd k	rbx| jD ]\}}| 	||¡ qJW | j
d k	r†x| j
D ]}| |¡ qtW | jd k	rœ| | j¡ | jd k	r²| | j¡ | jd k	rÈ| | j¡ | jd k	rÞ| | j¡ t |¡|_d S )N)r   r2   Úforce)r   r   r2   ra   rM   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   r6   ÚvalueZmacror   r   r   rX   ¡   s(    






zbuild_ext.setup_shlib_compilerc             C   s   t |tƒr|jS t | |¡S )N)rK   r	   Úexport_symbolsr*   Úget_export_symbols)r-   rA   r   r   r   rh   ¼   s    
zbuild_ext.get_export_symbolsc             C   s\   |  ¡  | j}z@t|tƒr"| j| _t | |¡ |jrL|  d¡j	}|  
||¡ W d || _X d S )Nr.   )Z_convert_pyx_sources_to_langr   rK   r	   rM   r*   Úbuild_extensionr>   r3   r=   r?   )r-   rA   Z	_compilerÚcmdr   r   r   ri   Á   s    
zbuild_ext.build_extensionc                sP   t  dd„ | jD ƒ¡‰ d |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   rV   Ó   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   r&   Õ   s    z-build_ext.links_to_dynamic.<locals>.<genexpr>)ÚdictÚfromkeysrU   r9   rY   r8   Úanyrc   )r-   rA   r   )rl   rm   r   rZ   Î   s     zbuild_ext.links_to_dynamicc             C   s   t  | ¡|  ¡  S )N)r*   Úget_outputsÚ_build_ext__get_stubs_outputs)r-   r   r   r   rq   ×   s    zbuild_ext.get_outputsc                s6   ‡ fdd„ˆ j D ƒ}t |ˆ  ¡ ¡}tdd„ |D ƒƒS )Nc             3   s0   | ](}|j rtjjˆ jf|j d ¡žŽ V  qdS )r/   N)r>   r:   r;   r9   r=   rY   r8   )r%   rA   )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    )r4   Ú	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  |   d¡jrdV  d S )Nz.pyz.pycr.   z.pyo)r3   Úoptimize)r-   r   r   r   Z__get_output_extensionså   s    z!build_ext.__get_output_extensionsFc             C   s,  t  d|j|¡ tjj|f|j d¡žŽ d }|rJtj |¡rJt|d ƒ‚| j	s¸t
|dƒ}| d ddd	td
ƒ dtj |j¡ dddtdƒdddtdƒddtdƒdddg¡¡ | ¡  |�r(ddlm} ||gdd| j	d� |  d¡j}|dk�r||g|d| j	d� tj |¡�r(| j	�s(t |¡ 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)ry   ra   r2   Úinstall_lib)r   ÚinforY   r:   r;   r9   r8   Úexistsr   r2   ÚopenÚwriteÚif_dlr<   r[   ÚcloseÚdistutils.utilr|   r3   ry   Úunlink)r-   Ú
output_dirrA   ÚcompileZ	stub_fileÚfr|   ry   r   r   r   r?   ë   sP    




zbuild_ext.write_stubN)F)Ú__name__Ú
__module__Ú__qualname__r+   r,   r7   rT   rW   rX   rh   ri   rZ   rq   rr   rv   r?   r   r   r   r   r   J   s   	r   c             C   s(   |   | j|||||||||	|
||¡ d S )N)ÚlinkZSHARED_LIBRARY)r-   ÚobjectsÚoutput_libnamer†   rc   r]   r_   rg   ÚdebugÚextra_preargsÚextra_postargsÚ
build_tempÚtarget_langr   r   r   rd     s
    rd   Zstaticc             C   s^   |d kst ‚tj |¡\}}tj |¡\}}|  d¡ d¡rH|dd … }|  |||||¡ d S )NÚxrk   é   )ÚAssertionErrorr:   r;   r8   rL   rN   Ú
startswithZcreate_static_lib)r-   r�   rŽ   r†   rc   r]   r_   rg   r�   r�   r‘   r’   r“   rC   r<   rA   r   r   r   rd   ,  s    )
NNNNNr   NNNN)
NNNNNr   NNNN)'r:   r   rt   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*   Ú
__import__ÚImportErrorr   r   r   r   rP   rO   r   r6   ÚdlÚhasattrr‚   r)   rd   r   r   r   r   Ú<module>   sX   

	 Q   	   