o
    JAfÍ=  ã                   @   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yc   eZY nw 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w dd„ Z*dd„ Z+G dd„ deƒZe$s³e j'dkr¾				d dd„Z,dS 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r0t ¡ }zdtd< dtd< dtd< t| ƒ W t ¡  t |¡ d S t ¡  t |¡ w 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   ú^/usr/lib/python3.10/site-packages/setuptools-67.5.1-py3.10.egg/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dede	e
e
f fdd	„Zd
d„ Zdede
de
fdd„Zdee	e
e
f  f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ee
 fdd „Zdee
e
f fd!d"„Zd#d$„ Zd%d&„ Zd/d'd(„Zd/d)e
defd*d+„Zd)e
fd,d-„Zd.S )0r	   FÚeditable_modeÚinplacec                 C   s2   | j d}| _ t | ¡ || _ |r|  ¡  dS 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ÚjoinÚget_package_dirÚosÚpathÚbasenameÚ	build_lib)
r.   Úbuild_pyr/   ÚfullnameÚfilenameÚmodpathÚpackageÚpackage_dirÚinplace_fileÚregular_filer   r   r   Ú_get_inplace_equivalentY   s   


z!build_ext._get_inplace_equivalentc                 C   sp   |   d¡}| jD ]-}|  ||¡\}}tj |¡s|js$| j||| jd |j	r5|  
||¡}| j||dd qd S )Nr=   )ÚlevelT)Úcompile)Úget_finalized_commandÚ
extensionsrE   r9   r:   ÚexistsÚoptionalÚ	copy_fileÚverboseÚ_needs_stubÚ_get_equivalent_stubÚ_write_stub_file)r.   r=   r/   rC   rD   Úinplace_stubr   r   r   r-   c   s   

€õz#build_ext.copy_extensions_to_sourceÚoutput_filec                 C   s2   t j |¡}|j d¡\}}}t j ||¡› dS ©Nr1   ú.py)r9   r:   Údirnamer4   Ú
rpartitionr7   )r.   r/   rR   Zdir_Ú_r4   r   r   r   rO   t   s   zbuild_ext._get_equivalent_stubc           
      c   s    | j sd S |  d¡}|  d¡jpd}| jD ]/}|  ||¡\}}||fV  |jrE|  ||¡}|  ||¡}t||d}t||d}	|	|fV  qd S )Nr=   Úinstall_libr#   )Úoptimization)r*   rH   ÚoptimizerI   rE   rN   rO   Ú_compiled_file_name)
r.   r=   Úoptr/   rC   rD   rQ   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 rk| j| }t	|dƒo.t
ƒ }|rA|d t|ƒ … }t
ƒ }|| }t|tƒrUt j |¡\}}| j |t¡S trk|jrkt j |¡\}}t j |d| ¡S |S )NZSETUPTOOLS_EXT_SUFFIXr1   Ú
EXT_SUFFIXÚpy_limited_apizdl-)r9   Úgetenvr:   r7   r6   r+   r5   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   r5   ’   s&   




zbuild_ext.get_ext_filenamec                 C   s&   t  | ¡ d | _g | _i | _d| _d S )NF)r+   Úinitialize_optionsrf   Úshlibsra   r)   ©r.   r   r   r   rm   ©   s
   

zbuild_ext.initialize_optionsc                 C   s8  t  | ¡ | jp	g | _|  | j¡ dd„ | jD ƒ| _| jr!|  ¡  | jD ]	}|  |j¡|_q$| jD ]`}|j}|| j	|< || j	| 
d¡d < | jrM|  |¡pNd}|oXtoXt|tƒ }||_||_|  |¡ }|_tj tj | j|¡¡}|r€||jvr€|j |¡ |r‘tr‘tj|jvr‘|j tj¡ q1| jršd| _d S d S )Nc                 S   s   g | ]	}t |tƒr|‘qS r   )rd   r   ©Ú.0r/   r   r   r   Ú
<listcomp>´   s    
ÿz.build_ext.finalize_options.<locals>.<listcomp>r1   r2   FT)r+   Úfinalize_optionsrI   Zcheck_extensions_listrn   Úsetup_shlib_compilerr3   r4   Ú
_full_namera   r6   Úlinks_to_dynamicri   rd   r   rj   rN   r5   Ú
_file_namer9   r:   rU   r7   r<   Úlibrary_dirsÚappendÚcurdirÚruntime_library_dirsr)   r*   )r.   r/   r>   ZltdÚnsr?   Úlibdirr   r   r   rs   °   s4   



€
ÿzbuild_ext.finalize_optionsc                 C   sæ   t | j| j| jd }| _t|ƒ | jd ur| | j¡ | jd ur/| jD ]
\}}| 	||¡ q$| j
d ur?| j
D ]}| |¡ q7| jd urJ| | j¡ | jd urU| | j¡ | jd ur`| | j¡ | jd urk| | j¡ t |¡|_d S )N)r   Údry_runÚforce)r
   r   r~   r   rf   r    Úinclude_dirsZset_include_dirsZdefineZdefine_macroZundefZundefine_macroÚ	librariesZset_librariesrx   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   rt   Ð   s*   ÿ







zbuild_ext.setup_shlib_compilerc                 C   s   t |tƒr|jS t | |¡S ©N)rd   r   Úexport_symbolsr+   Úget_export_symbols©r.   r/   r   r   r   r‡   ë   s   
zbuild_ext.get_export_symbolsc                 C   sl   |  ¡  | j}z*t|tƒr| j| _t | |¡ |jr,|  d¡j	}|  
||¡ W || _d S W || _d S || _w )Nr=   )Ú_convert_pyx_sources_to_langr   rd   r   rf   r+   Úbuild_extensionrN   rH   r<   Ú
write_stub)r.   r/   Z	_compilerr<   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   )ru   )rq   Úlibr   r   r   rr     s    z.build_ext.links_to_dynamic.<locals>.<listcomp>r1   Nr2   r#   c                 3   s    | ]	}ˆ| ˆ v V  qd S r…   r   )rq   Zlibname©ZlibnamesÚpkgr   r   Ú	<genexpr>  ó   € z-build_ext.links_to_dynamic.<locals>.<genexpr>)ÚdictÚfromkeysrn   r7   ru   r6   Úanyr   rˆ   r   r   r   rv   ý   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_outputsro   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>  s    z.build_ext.get_output_mapping.<locals>.<lambda>)Úkey)r]   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   s4    | ]}|j rtjjˆ jg|j d ¡¢R Ž V  qdS )r1   N)rN   r9   r:   r7   r<   ru   r6   rp   ro   r   r   r     s   € ý
ÿz0build_ext.__get_stubs_outputs.<locals>.<genexpr>c                 s   s    | ]	\}}|| V  qd S r…   r   )rq   ÚbaseZfnextr   r   r   r     r   )rI   Ú	itertoolsÚproductÚ!_build_ext__get_output_extensionsr”   )r.   Zns_ext_basesÚpairsr   ro   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 d S )NrT   z.pycr=   z.pyo)rH   rZ   ro   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 rS   )r9   r:   r7   ru   r6   rP   )r.   Ú
output_dirr/   rG   Ú	stub_filer   r   r   r‹   !  s    zbuild_ext.write_stubr¤   c                 C   s¶   t  d|j|¡ |rtj |¡rt|d ƒ‚| jsPt|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¡¡ | ¡  |rY|  |¡ d S 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   Úinforu   r9   r:   rJ   r   r~   ÚopenÚwriter7   r&   r;   rw   ÚcloseÚ_compile_and_remove_stub)r.   r¤   r/   rG   Úfr   r   r   rP   %  sL   
ÿþèÿÿzbuild_ext._write_stub_filec                 C   sp   ddl m} ||gdd| jd |  d¡j}|dkr$||g|d| jd tj |¡r4| js6t |¡ d S d S d S )Nr   )Úbyte_compileT)rZ   r   r~   rX   )	Údistutils.utilr­   r~   rH   rZ   r9   r:   rJ   Úunlink)r.   r¤   r­   rZ   r   r   r   r«   K  s   ÿÿÿz"build_ext._compile_and_remove_stubN)F) Ú__name__Ú
__module__Ú__qualname__r)   ÚboolÚ__annotations__r*   r,   r   r   ÚstrrE   r-   rO   r   r]   r5   rm   rs   rt   r‡   rŠ   rv   r   r˜   r   r•   r™   r¡   r‹   rP   r«   r   r   r   r   r	   M   s,   
 
 	
&r	   c                 C   s(   |   | j|||||||||	|
||¡ d S r…   )ÚlinkZSHARED_LIBRARY)r.   ÚobjectsÚoutput_libnamer£   r   rx   r{   r†   ÚdebugÚextra_preargsÚextra_postargsÚ
build_tempÚtarget_langr   r   r   r‚   [  s   ür‚   Ústaticc                 C   s^   |d u sJ ‚t j |¡\}}t j |¡\}}|  d¡ d¡r$|dd … }|  |||||¡ d S )Nrš   rŒ   é   )r9   r:   r6   re   rg   Ú
startswithZcreate_static_lib)r.   r·   r¸   r£   r   rx   r{   r†   r¹   rº   r»   r¼   r½   r?   r;   r/   r   r   r   r‚   j  s   
ÿ)
NNNNNr   NNNN)-r9   r   rŸ   Zimportlib.machineryr   Úimportlib.utilr   r[   Útypingr   r   r   r   Zdistutils.command.build_extr	   Z_du_build_extZdistutils.ccompilerr
   Údistutils.sysconfigr   r   Ú	distutilsr   Úsetuptools.errorsr   Úsetuptools.extensionr   r   ZCython.Distutils.build_extr+   Ú
__import__ÚImportErrorr   r   r    r$   ri   rh   r   r4   ÚdlÚhasattrr&   r(   r‚   r   r   r   r   Ú<module>   sd    ÿ

ÿ	  üü