a
    ÅydÍ=  ã                
   @   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	m
Z
mZ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mZ zd dlmZ edƒ W n eyÆ   eZY n0 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>zd dl(Z(e)e(dƒ Z$Z#W n ey<   Y n0 dd„ Z*dd„ Z+G dd„ deƒZe$spe j'dkr|d dd„Z,ndZ%d!dd„Z,dS )"é    N©ÚEXTENSION_SUFFIXES)Úcache_from_source)ÚDictÚIteratorÚListÚTuple)Ú	build_ext)Únew_compiler)Úcustomize_compilerÚget_config_var)Úlog)Ú	BaseError)Ú	ExtensionÚLibraryzCython.Compiler.MainÚLDSHARED)Ú_config_varsc              	   C   sl   t jdkr`t ¡ }z6dtd< dtd< dtd< t| ƒ W t ¡  t |¡ qht ¡  t |¡ 0 nt| ƒ d S )NÚdarwinz0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupr   z -dynamiclibZCCSHAREDz.dylibZSO)ÚsysÚplatformÚ_CONFIG_VARSÚcopyr   ÚclearÚupdate)ÚcompilerÚtmp© r   ú;lib/python3.9/site-packages/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   Úif_dl@   s    r$   c                  C   s.   t D ]$} d| v r|   S | dkr|   S qdS )z;Return the file extension for an abi3-compliant Extension()z.abi3z.pydNr   )Úsuffixr   r   r   Úget_abi3_suffixD   s
    r&   c                   @   s  e Zd ZU dZeed< dZeed< dd„ Zee	e
e
f dœdd„Zd	d
„ Zee
e
dœdd„Zee	e
e
f  dœdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zee
 dœdd „Zee
e
f dœd!d"„Zd#d$„ Zd%d&„ Zd0d'd(„Zd1e
ed)œd*d+„Ze
d,œd-d.„Zd/S )2r	   FÚeditable_modeÚinplacec                 C   s.   | j d }| _ t | ¡ || _ |r*|  ¡  dS )z;Build extensions in build directory, then copy if --inplacer   N)r(   Ú
_build_extÚrunÚcopy_extensions_to_source)ÚselfZold_inplacer   r   r   r*   Q   s
    
zbuild_ext.run)ÚextÚreturnc           
      C   sj   |   |j¡}|  |¡}| d¡}d |d d… ¡}| |¡}tj |tj |¡¡}tj | j	|¡}	||	fS )NÚ.éÿÿÿÿ)
Úget_ext_fullnameÚnameÚget_ext_filenameÚsplitÚjoinZget_package_dirÚosÚpathÚbasenameÚ	build_lib)
r,   Úbuild_pyr-   ÚfullnameÚfilenameÚmodpathÚpackageZpackage_dirÚinplace_fileÚregular_filer   r   r   Ú_get_inplace_equivalentY   s    


z!build_ext._get_inplace_equivalentc                 C   sp   |   d¡}| jD ]Z}|  ||¡\}}tj |¡s6|jsH| j||| jd |j	r|  
||¡}| j||dd qd S )Nr:   )ÚlevelT)Úcompile)Úget_finalized_commandÚ
extensionsrA   r6   r7   ÚexistsZoptionalZ	copy_fileÚverboseÚ_needs_stubÚ_get_equivalent_stubÚ_write_stub_file)r,   r:   r-   r?   r@   Úinplace_stubr   r   r   r+   c   s    

z#build_ext.copy_extensions_to_source)r-   Úoutput_filer.   c                 C   s2   t j |¡}|j d¡\}}}t j ||¡› dS ©Nr/   ú.py)r6   r7   Údirnamer2   Ú
rpartitionr5   )r,   r-   rL   Zdir_Ú_r2   r   r   r   rI   t   s    zbuild_ext._get_equivalent_stub)r.   c           
      c   sŽ   | j s
d S |  d¡}|  d¡jp"d}| jD ]^}|  ||¡\}}||fV  |jr*|  ||¡}|  ||¡}t||d}t||d}	|	|fV  q*d S )Nr:   Úinstall_libr!   )Úoptimization)r(   rD   ÚoptimizerE   rA   rH   rI   Ú_compiled_file_name)
r,   r:   Zoptr-   r?   r@   rK   Zregular_stubZinplace_cacheZoutput_cacher   r   r   Ú_get_output_mappingy   s    


zbuild_ext._get_output_mappingc                 C   sÚ   t  d¡}|r&t jj| d¡Ž | }nt | |¡}tdƒ}|| jv rÖ| j| }t	|dƒo\t
ƒ }|r‚|d t|ƒ … }t
ƒ }|| }t|tƒrªt j |¡\}}| j |t¡S trÖ|jrÖt j |¡\}}t j |d| ¡S |S )NZSETUPTOOLS_EXT_SUFFIXr/   Z
EXT_SUFFIXZpy_limited_apizdl-)r6   Úgetenvr7   r5   r4   r)   r3   r   Úext_mapÚgetattrr&   ÚlenÚ
isinstancer   ÚsplitextÚshlib_compilerÚlibrary_filenameÚlibtypeÚ	use_stubsÚ_links_to_dynamic)r,   r;   Zso_extr<   r-   Zuse_abi3ÚfnÚdr   r   r   r3   ’   s&    




zbuild_ext.get_ext_filenamec                 C   s&   t  | ¡ d | _g | _i | _d| _d S )NF)r)   Úinitialize_optionsr]   ÚshlibsrX   r'   ©r,   r   r   r   rd   ©   s
    
zbuild_ext.initialize_optionsc                 C   s:  t  | ¡ | jpg | _|  | j¡ dd„ | jD ƒ| _| jrB|  ¡  | jD ]}|  |j¡|_qH| jD ]Ä}|j}|| j	|< || j	| 
d¡d < | jrš|  |¡pœd}|o°to°t|tƒ }||_||_|  |¡ }|_tj tj | j|¡¡}|r||jvr|j |¡ |rbtrbtj|jvrb|j tj¡ qb| jr6d| _d S )Nc                 S   s   g | ]}t |tƒr|‘qS r   )r[   r   ©Ú.0r-   r   r   r   Ú
<listcomp>´   s   
ÿz.build_ext.finalize_options.<locals>.<listcomp>r/   r0   FT)r)   Úfinalize_optionsrE   Zcheck_extensions_listre   Úsetup_shlib_compilerr1   r2   Ú
_full_namerX   r4   Úlinks_to_dynamicr`   r[   r   ra   rH   r3   Ú
_file_namer6   r7   rO   r5   r9   Úlibrary_dirsÚappendÚcurdirÚruntime_library_dirsr'   r(   )r,   r-   r;   ZltdÚnsr<   Úlibdirr   r   r   rj   °   s0    



zbuild_ext.finalize_optionsc                 C   sæ   t | j| j| jd }| _t|ƒ | jd ur8| | j¡ | jd ur^| jD ]\}}| 	||¡ qH| j
d ur~| j
D ]}| |¡ qn| jd ur”| | j¡ | jd urª| | j¡ | jd urÀ| | j¡ | jd urÖ| | j¡ t |¡|_d S )N)r   Údry_runÚforce)r
   r   ru   rv   r]   r   Zinclude_dirsZset_include_dirsZdefineZdefine_macroZundefZundefine_macroÚ	librariesZset_librariesro   Zset_library_dirsZrpathZset_runtime_library_dirsZlink_objectsZset_link_objectsÚlink_shared_objectÚ__get__)r,   r   r2   ÚvalueZmacror   r   r   rk   Ð   s*    ÿ







zbuild_ext.setup_shlib_compilerc                 C   s   t |tƒr|jS t | |¡S ©N)r[   r   Úexport_symbolsr)   Úget_export_symbols©r,   r-   r   r   r   r}   ë   s    
zbuild_ext.get_export_symbolsc                 C   sb   |  ¡  | j}zFt|tƒr"| j| _t | |¡ |jrL|  d¡j	}|  
||¡ W || _n|| _0 d S )Nr:   )Z_convert_pyx_sources_to_langr   r[   r   r]   r)   Úbuild_extensionrH   rD   r9   Ú
write_stub)r,   r-   Z	_compilerr9   r   r   r   r   ð   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   )rl   )rh   Úlibr   r   r   ri     ó    z.build_ext.links_to_dynamic.<locals>.<listcomp>r/   Nr0   r!   c                 3   s   | ]}ˆ| ˆ v V  qd S r{   r   )rh   Zlibname©ZlibnamesÚpkgr   r   Ú	<genexpr>  r‚   z-build_ext.links_to_dynamic.<locals>.<genexpr>)ÚdictÚfromkeysre   r5   rl   r4   Úanyrw   r~   r   rƒ   r   rm   ý   s     zbuild_ext.links_to_dynamicc                 C   s,   | j rt|  ¡  ¡ ƒS tt | ¡|  ¡  ƒS r{   )r(   ÚlistÚget_output_mappingÚkeysÚsortedr)   Úget_outputsÚ_build_ext__get_stubs_outputsrf   r   r   r   r     s    zbuild_ext.get_outputsc                 C   s   |   ¡ }tt|dd„ dƒS )z1See :class:`setuptools.commands.build.SubCommand`c                 S   s   | d S )Nr   r   )Úxr   r   r   Ú<lambda>  r‚   z.build_ext.get_output_mapping.<locals>.<lambda>)Úkey)rV   r†   rŒ   )r,   Úmappingr   r   r   rŠ     s    zbuild_ext.get_output_mappingc                    s6   ‡ fdd„ˆ j D ƒ}t |ˆ  ¡ ¡}tdd„ |D ƒƒS )Nc                 3   s2   | ]*}|j rtjjˆ jg|j d ¡¢R Ž V  qdS )r/   N)rH   r6   r7   r5   r9   rl   r4   rg   rf   r   r   r…     s   þz0build_ext.__get_stubs_outputs.<locals>.<genexpr>c                 s   s   | ]\}}|| V  qd S r{   r   )rh   ÚbaseZfnextr   r   r   r…     r‚   )rE   Ú	itertoolsÚproductÚ!_build_ext__get_output_extensionsr‰   )r,   Zns_ext_basesZpairsr   rf   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 )NrN   z.pycr:   z.pyo)rD   rT   rf   r   r   r   Z__get_output_extensions  s    z!build_ext.__get_output_extensionsc                 C   s2   t jj|g|j d¡¢R Ž d }|  |||¡ d S rM   )r6   r7   r5   rl   r4   rJ   )r,   Ú
output_dirr-   rC   Ú	stub_filer   r   r   r€   !  s     zbuild_ext.write_stub)r˜   r-   c                 C   s²   t  d|j|¡ |r,tj |¡r,t|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dddtdƒdddg¡¡ | ¡  |r®|  |¡ d S )Nz writing stub loader for %s to %sz already exists! Please delete.ÚwÚ
zdef __bootstrap__():z-   global __bootstrap__, __file__, __loader__z0   import sys, os, pkg_resources, importlib.utilz, 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)z3     spec = importlib.util.spec_from_file_location(z#                __name__, __file__)z0     mod = importlib.util.module_from_spec(spec)z!     spec.loader.exec_module(mod)z   finally:z"     sys.setdlopenflags(old_flags)z     os.chdir(old_dir)z__bootstrap__()r!   )r   Úinforl   r6   r7   rF   r   ru   ÚopenÚwriter5   r$   r8   rn   ÚcloseÚ_compile_and_remove_stub)r,   r˜   r-   rC   Úfr   r   r   rJ   %  sJ    
ÿþèÿzbuild_ext._write_stub_file)r˜   c                 C   sh   ddl m} ||gdd| jd |  d¡j}|dkrH||g|d| jd tj |¡rd| jsdt |¡ d S )Nr   )Úbyte_compileT)rT   rv   ru   rR   )	Zdistutils.utilr¡   ru   rD   rT   r6   r7   rF   Úunlink)r,   r˜   r¡   rT   r   r   r   rŸ   K  s    ÿÿz"build_ext._compile_and_remove_stubN)F)F) Ú__name__Ú
__module__Ú__qualname__r'   ÚboolÚ__annotations__r(   r*   r   r   ÚstrrA   r+   rI   r   rV   r3   rd   rj   rk   r}   r   rm   r   r   r   rŠ   rŽ   r–   r€   rJ   rŸ   r   r   r   r   r	   M   s*   

 	
&r	   c                 C   s(   |   | j|||||||||	|
||¡ d S r{   )ÚlinkZSHARED_LIBRARY)r,   ÚobjectsÚoutput_libnamer—   rw   ro   rr   r|   ÚdebugÚextra_preargsÚextra_postargsÚ
build_tempÚtarget_langr   r   r   rx   [  s    ürx   Zstaticc                 C   s^   |d u sJ ‚t j |¡\}}t j |¡\}}|  d¡ d¡rH|dd … }|  |||||¡ d S )Nr   r   é   )r6   r7   r4   r\   r^   Ú
startswithZcreate_static_lib)r,   rª   r«   r—   rw   ro   rr   r|   r¬   r­   r®   r¯   r°   r<   r8   r-   r   r   r   rx   j  s    
ÿ)
NNNNNr   NNNN)
NNNNNr   NNNN)-r6   r   r”   Úimportlib.machineryr   Úimportlib.utilr   rU   Útypingr   r   r   r   Zdistutils.command.build_extr	   Z_du_build_extZdistutils.ccompilerr
   Zdistutils.sysconfigr   r   Ú	distutilsr   Zsetuptools.errorsr   Zsetuptools.extensionr   r   ZCython.Distutils.build_extr)   Ú
__import__ÚImportErrorr   r   r   r"   r`   r_   r   r2   ZdlÚhasattrr$   r&   rx   r   r   r   r   Ú<module>   s^   
	      ü    ü