509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
Ävhu3  ã               @   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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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)ÚcompilerZtmp© r   ú/usr/lib/python3.6/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>>   s    r   c              C   s>   x8dd„ t jƒ 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)ÚimpZ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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(   K   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|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   r.   r/   Ú_needs_stubÚ
write_stubÚcurdir)
r*   r+   ÚextÚfullnameÚfilenameZmodpathÚpackageZpackage_dirZdest_filenameZsrc_filenamer   r   r   r)   S   s    




z#build_ext.copy_extensions_to_sourcec             C   s¶   t j| |ƒ}|| jkr²| j| }tjo4t|dƒo4tƒ }|r^tdƒ}|d t|ƒ … }|tƒ  }t	|t
ƒr†tjj|ƒ\}}| jj|tƒS tr²|jr²tjj|ƒ\}}tjj|d| ƒS |S )NZpy_limited_apiÚ
EXT_SUFFIXzdl-)r'   r5   Úext_mapr
   ZPY3Úgetattrr&   Ú_get_config_var_837ÚlenÚ
isinstancer	   r8   r9   ÚsplitextÚshlib_compilerÚlibrary_filenameÚlibtypeÚ	use_stubsÚ_links_to_dynamicr6   r7   )r*   r@   rA   r?   Zuse_abi3Zso_extÚfnÚdr   r   r   r5   i   s"    





zbuild_ext.get_ext_filenamec             C   s    t j| ƒ d | _g | _i | _d S )N)r'   Úinitialize_optionsrJ   ÚshlibsrD   )r*   r   r   r   rQ   ~   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|ƒp¢d}|o¶to¶t|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   )rH   r	   )r"   r?   r   r   r   ú
<listcomp>ˆ   s    z.build_ext.finalize_options.<locals>.<listcomp>r,   r-   Fr0   )r'   Úfinalize_optionsr2   Zcheck_extensions_listrR   Úsetup_shlib_compilerr3   r4   Ú
_full_namerD   r6   Úlinks_to_dynamicrM   rH   r	   rN   r<   r5   Ú
_file_namer8   r9   Údirnamer7   r;   Úlibrary_dirsÚappendr>   Úruntime_library_dirs)r*   r?   r@   ZltdÚnsrA   Zlibdirr   r   r   rT   „   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	r†x| 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   r/   Úforce)r   r   r/   r^   rJ   r   Zinclude_dirsZset_include_dirsZdefineZdefine_macroZundefZundefine_macroÚ	librariesZset_librariesrZ   Zset_library_dirsZrpathZset_runtime_library_dirsZlink_objectsZset_link_objectsÚlink_shared_objectÚ__get__)r*   r   r4   ÚvalueZmacror   r   r   rU   ¡   s(    






zbuild_ext.setup_shlib_compilerc             C   s   t |tƒr|jS tj| |ƒS )N)rH   r	   Úexport_symbolsr'   Úget_export_symbols)r*   r?   r   r   r   rd   ¼   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   rH   r	   rJ   r'   Úbuild_extensionr<   r1   r;   r=   )r*   r?   Z	_compilerÚcmdr   r   r   re   Á   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   )rV   )r"   Úlibr   r   r   rS   Ó   s    z.build_ext.links_to_dynamic.<locals>.<listcomp>r,   Nr-   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>r0   )ÚdictÚfromkeysrR   r7   rV   r6   Úanyr_   )r*   r?   r   )rh   ri   r   rW   Î   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   rm   ×   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<   r8   r9   r7   r;   rV   r6   )r"   r?   )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    )r2   Ú	itertoolsÚproductÚ!_build_ext__get_output_extensionsÚlist)r*   Zns_ext_basesZ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)r1   Ú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	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| 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)rt   r^   r/   Zinstall_lib)r   ÚinforV   r8   r9   r7   r6   Úexistsr   r/   ÚopenÚwriteÚif_dlr:   rX   ÚcloseZdistutils.utilrw   r1   rt   Úunlink)r*   Ú
output_dirr?   ÚcompileZ	stub_fileÚfrw   rt   r   r   r   r=   ë   sP    




zbuild_ext.write_stubN)F)Ú__name__Ú
__module__Ú__qualname__r(   r)   r5   rQ   rT   rU   rd   re   rW   rm   rn   rr   r=   r   r   r   r   r   J   s   	r   c             C   s(   | j | j|||||||||	|
||ƒ d S )N)ÚlinkZSHARED_LIBRARY)r*   ÚobjectsÚoutput_libnamer   r_   rZ   r\   rc   ÚdebugÚextra_preargsÚextra_postargsÚ
build_tempÚtarget_langr   r   r   r`     s
    r`   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Úxrg   é   )ÚAssertionErrorr8   r9   r6   rI   rK   Ú
startswithZcreate_static_lib)r*   r†   r‡   r   r_   rZ   r\   rc   rˆ   r‰   rŠ   r‹   rŒ   rA   r:   r?   r   r   r   r`   ,  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Ž   r-   r   )rŽ   rŽ   r-   )r   Úversion_infor   )r4   r   r   r   rF   D  s    
rF   )
NNNNNr   NNNN)
NNNNNr   NNNN)(r8   r   rp   r!   Zdistutils.command.build_extr   Z_du_build_extZdistutils.file_utilr   Zdistutils.ccompilerr   Zdistutils.sysconfigr   r   Zdistutils.errorsr   Z	distutilsr   Zsetuptools.extensionr	   Zsetuptools.externr
   ZCython.Distutils.build_extr'   Ú
__import__ÚImportErrorr   r   r   r   rM   rL   r   r4   ZdlÚhasattrr|   r&   r`   rF   r   r   r   r   Ú<module>   sZ   

	 Q   	   
