B
    =)H[a2  ã            
   @   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   údC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-qz7kpjmn\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>>   s    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"   Ú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)Ú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ÚjoinÚget_package_dirÚosÚpathÚbasenameÚ	build_libr   r2   r3   Ú_needs_stubÚ
write_stubÚcurdir)
r.   r/   ÚextÚfullnameÚfilenameÚ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+   r8   Úext_mapr
   ÚPY3Úgetattrr)   r   ÚlenÚ
isinstancer	   r<   r=   ÚsplitextÚshlib_compilerÚlibrary_filenameÚlibtypeÚ	use_stubsÚ_links_to_dynamicr9   r:   )r.   rD   rE   rC   Zuse_abi3Zso_extÚfnÚdr   r   r   r8   i   s"    





zbuild_ext.get_ext_filenamec             C   s    t  | ¡ d | _g | _i | _d S )N)r+   Úinitialize_optionsrP   ÚshlibsrJ   )r.   r   r   r   rW   ~   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   )rN   r	   )r$   rC   r   r   r   ú
<listcomp>ˆ   s    z.build_ext.finalize_options.<locals>.<listcomp>r0   r1   F)r+   Úfinalize_optionsr5   Úcheck_extensions_listrX   Úsetup_shlib_compilerr6   r7   Ú
_full_namerJ   r9   Úlinks_to_dynamicrS   rN   r	   rT   r@   r8   Ú
_file_namer<   r=   Údirnamer:   r?   Úlibrary_dirsÚappendrB   Úruntime_library_dirs)r.   rC   rD   ZltdÚnsrE   Zlibdirr   r   r   rZ   „   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   r3   Úforce)r   r   r3   re   rP   r   Úinclude_dirsÚset_include_dirsÚdefineÚdefine_macroÚundefÚundefine_macroÚ	librariesÚset_librariesra   Úset_library_dirsÚrpathÚset_runtime_library_dirsÚlink_objectsÚset_link_objectsÚlink_shared_objectÚ__get__)r.   r   r7   ÚvalueÚmacror   r   r   r\   ¡   s(    






zbuild_ext.setup_shlib_compilerc             C   s   t |tƒr|jS t | |¡S )N)rN   r	   Úexport_symbolsr+   Úget_export_symbols)r.   rC   r   r   r   rx   ¼   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   rN   r	   rP   r+   Úbuild_extensionr@   r4   r?   rA   )r.   rC   Z	_compilerÚcmdr   r   r   ry   Á   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   )r]   )r$   Úlibr   r   r   rY   Ó   s    z.build_ext.links_to_dynamic.<locals>.<listcomp>r0   Nr1   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>)ÚdictÚfromkeysrX   r:   r]   r9   Úanyrl   )r.   rC   r   )r}   r~   r   r^   Î   s     zbuild_ext.links_to_dynamicc             C   s   t  | ¡|  ¡  S )N)r+   Úget_outputsÚ_build_ext__get_stubs_outputs)r.   r   r   r   r‚   ×   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 )r0   N)r@   r<   r=   r:   r?   r]   r9   )r$   rC   )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  |   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  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 %sr0   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Š   re   r3   Úinstall_lib)r   Úinfor]   r<   r=   r:   r9   Úexistsr   r3   ÚopenÚwriteÚif_dlr>   r_   ÚcloseÚdistutils.utilr�   r4   rŠ   Úunlink)r.   Ú
output_dirrC   ÚcompileZ	stub_fileÚfr�   rŠ   r   r   r   rA   ë   sP    




zbuild_ext.write_stubN)F)Ú__name__Ú
__module__Ú__qualname__r,   r-   r8   rW   rZ   r\   rx   ry   r^   r‚   rƒ   r‡   rA   r   r   r   r   r   J   s   	r   c             C   s(   |   | j|||||||||	|
||¡ d S )N)ÚlinkZSHARED_LIBRARY)r.   ÚobjectsÚoutput_libnamer—   rl   ra   rc   rw   ÚdebugÚextra_preargsÚextra_postargsÚ
build_tempÚtarget_langr   r   r   rs     s
    rs   Zstaticc             C   s^   |d kst ‚tj |¡\}}tj |¡\}}|  d¡ d¡rH|dd … }|  |||||¡ d S )NÚxr{   é   )ÚAssertionErrorr<   r=   r9   rO   rQ   Ú
startswithZcreate_static_lib)r.   rž   rŸ   r—   rl   ra   rc   rw   r    r¡   r¢   r£   r¤   rE   r>   rC   r   r   r   rs   ,  s    )
NNNNNr   NNNN)
NNNNNr   NNNN)'r<   r   r…   r"   Ú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
   ZCython.Distutils.build_extr+   Ú
__import__ÚImportErrorr   r   r   r   rS   rR   r   r7   ÚdlÚhasattrr“   r)   rs   r   r   r   r   Ú<module>   sX   

	 Q   	   